之前就學(xué)過c++效诅,android上用得少就放下了口叙,閑來無事重新拾起來
我的環(huán)境配置:mac + android studio 3.0.1
已經(jīng)下載好ndk并且配置好了权旷,不是重點江锨,略贞言。
開始
根據(jù)自己之前有的一點經(jīng)驗斜棚,先在gradle.properties文件中加上
android.useDeprecatedNdk=true
然后在module的build.gradle文件defaultConfig節(jié)點加上
ndk {
// 模塊名稱
moduleName = "fffff"
// 指定編譯平臺,更多平臺信息 參見https://developer.android.com/ndk/guides/abis.html#sa
abiFilters "armeabi", "armeabi-v7a"
}
搞定之后使用native關(guān)鍵字寫JNI接口该窗,不要在意類名
public class JJJJ {
static {
System.loadLibrary("fffff");
}
public static native String ddd(String key);
}
下一步就是生成.h文件了弟蚀,看了網(wǎng)上的幾個方法,參數(shù)都比較長酗失,記不住啊
找了一種偷懶的方法
在studio自帶的命令行中輸入
cd app/src/main/java/
進(jìn)到j(luò)ava目錄义钉,執(zhí)行
javah com.yuan.nfc.JJJJ
其中com.yuan.nfc.JJJJ 是你的JNI接口類的完成包名洒试,執(zhí)行完后會在java目錄下生成一個.h文件扣讼,自己在main目錄新建一個jni文件夾,把生成的.h文件拖過去
新建一個.c文件铝阐,引入生成的.h文件,并把.h文件中的方法復(fù)制到.c文件中删壮,補全參數(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");
}
然后寫一個Android.mk文件贪绘,
一切完成,當(dāng)你編譯的時候會發(fā)現(xiàn)報錯了
* 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)過期了税灌,可以使用CMake或ndk構(gòu)建集成。如果還要繼續(xù)用就在gradle.properties 文件中設(shè)置android.deprecatedNdkCompileLease = 1523342056769
事實證明這樣設(shè)置并無卵用
改用CMake吧
在SDK Manager中安裝CMake
在module的defaultConfig節(jié)點下添加
externalNativeBuild {
cmake {
cppFlags ""
abiFilters "armeabi", "armeabi-v7a"
}
}
在android節(jié)點下添加
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
在app目錄下添加一個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接口類
public class JJJJ {
static {
System.loadLibrary("javac");
}
public static native String ddd(String key);
}
在ddd方法上直接alt+return 洛勉,選擇第一個回車粘秆,自動生成c文件
直接調(diào)用測試
編譯運行
可以調(diào)用成功。
最后發(fā)現(xiàn)有一個問題坯认,就是改變編譯生成的so文件名時翻擒,需要clean一下,否則會生成重復(fù)的so文件打包進(jìn)apk中