之前就學(xué)過(guò)c++,android上用得少就放下了,閑來(lái)無(wú)事重新拾起來(lái)
我的環(huán)境配置:mac + android studio 3.0.1
已經(jīng)下載好ndk并且配置好了,不是重點(diǎn),略。
開(kāi)始
根據(jù)自己之前有的一點(diǎn)經(jīng)驗(yàn),先在gradle.properties文件中加上
android.useDeprecatedNdk=true
然后在module的build.gradle文件defaultConfig節(jié)點(diǎn)加上
ndk {
// 模塊名稱(chēng)
moduleName = "fffff"
// 指定編譯平臺(tái),更多平臺(tái)信息 參見(jiàn)https://developer.android.com/ndk/guides/abis.html#sa
abiFilters "armeabi", "armeabi-v7a"
}
搞定之后使用native關(guān)鍵字寫(xiě)JNI接口,不要在意類(lèi)名
public class JJJJ {
static {
System.loadLibrary("fffff");
}
public static native String ddd(String key);
}
下一步就是生成.h文件了,看了網(wǎng)上的幾個(gè)方法,參數(shù)都比較長(zhǎng),記不住啊
找了一種偷懶的方法
在studio自帶的命令行中輸入
cd app/src/main/java/
進(jìn)到j(luò)ava目錄,執(zhí)行
javah com.yuan.nfc.JJJJ
其中com.yuan.nfc.JJJJ 是你的JNI接口類(lèi)的完成包名,執(zhí)行完后會(huì)在java目錄下生成一個(gè).h文件,自己在main目錄新建一個(gè)jni文件夾,把生成的.h文件拖過(guò)去
新建一個(gè).c文件,引入生成的.h文件,并把.h文件中的方法復(fù)制到.c文件中,補(bǔ)全參數(shù)
#include "com_yuan_nfc_JJJJ.h"
JNIEXPORT jstring JNICALL Java_com_yuan_nfc_JJJJ_ddd (JNIEnv *env, jclass jcls, jstring jcontent){
return *env -> NewStringUTF(env," this is a native fun");
}
然后寫(xiě)一個(gè)Android.mk文件,

一切完成,當(dāng)你編譯的時(shí)候會(huì)發(fā)現(xiàn)報(bào)錯(cuò)了
* What went wrong:
Execution failed for task ':app:compileDebugNdk'.
> Error: Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio. Please switch to a supported build system.
Consider using CMake or ndk-build integration. For more information, go to:
https://d.android.com/r/studio-ui/add-native-code.html#ndkCompile
To get started, you can use the sample ndk-build script the Android
plugin generated for you at:
/Users/macbook-HCI/GitHub/Nfc/app/build/intermediates/ndk/debug/Android.mk
Alternatively, you can use the experimental plugin:
https://developer.android.com/r/tools/experimental-plugin.html
To continue using the deprecated NDK compile for another 60 days, set
android.deprecatedNdkCompileLease=1523343802768 in gradle.properties
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
* Get more help at https://help.gradle.org
大概意思就是,android.useDeprecatedNdk=true 這樣已經(jīng)過(guò)期了,可以使用CMake或ndk構(gòu)建集成。如果還要繼續(xù)用就在gradle.properties 文件中設(shè)置android.deprecatedNdkCompileLease = 1523342056769

事實(shí)證明這樣設(shè)置并無(wú)卵用
改用CMake吧
在SDK Manager中安裝CMake

在module的defaultConfig節(jié)點(diǎn)下添加
externalNativeBuild {
cmake {
cppFlags ""
abiFilters "armeabi", "armeabi-v7a"
}
}
在android節(jié)點(diǎn)下添加
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
在app目錄下添加一個(gè)CMakeLists.txt文件,內(nèi)容為
cmake_minimum_required(VERSION 3.4.1)
add_library(
javac
SHARED
src/main/jni/javac.c )
第一行指定CMake版本,add_library中的第一行為so文件的名字,第三行為c文件的路徑
JNI接口類(lèi)
public class JJJJ {
static {
System.loadLibrary("javac");
}
public static native String ddd(String key);
}
在ddd方法上直接alt+return ,選擇第一個(gè)回車(chē),自動(dòng)生成c文件


直接調(diào)用測(cè)試

編譯運(yùn)行

可以調(diào)用成功。
最后發(fā)現(xiàn)有一個(gè)問(wèn)題,就是改變編譯生成的so文件名時(shí),需要clean一下,否則會(huì)生成重復(fù)的so文件打包進(jìn)apk中