開發(fā)環(huán)境
Mac OSX 10.11.2
Android Studio 2.1
NDK-r11c
準備工作
下載并解壓NDK允华, 官網(wǎng)下載询刹,歷史版本
添加到PATH中
該操作不是必須的装悲,如果通過命令ndk-build
的方式手動編譯的話則最好配置環(huán)境變量。初次執(zhí)行ndk-build
會提示:
Mac系統(tǒng)需要在~/.bash_profile文件中配置NDK_PROJECT_PATH
,如下:
export NDK_PROJECT_PATH=../ndk/android-ndk-r11c #你的ndk目錄
export PATH=$NDK_PROJECT_PATH:$PATH
# 執(zhí)行 source ~/.bash_profile 使之生效
source ~/.bash_profile
集成到Android Studio 中
- 新建一個Android工程
NDKTest
- 添加
android.useDeprecatedNdk=true
到app下的gradle.properties
中 - 在
Project Structure
->SDK Location
->Android NDK Location
中指定NDK的路徑;或者直接在local.properties
文件中指定ndk.dir
和敬,最終該文件內(nèi)容為:
ndk.dir=../ndk/android-ndk-r11c
sdk.dir=../sdk
- 在
main
文件夾下創(chuàng)建一個JNI Folder
- 添加如下
gradle
配置:
defaultConfig {
...
ndk {
// 模塊名稱
moduleName = "ndk-test"
// 指定編譯平臺,更多平臺信息 參見https://developer.android.com/ndk/guides/abis.html#sa
abiFilters "armeabi", "armeabi-v7a"
}
}
sourceSets.main {
// 你的源碼目錄
jni.srcDir 'src/main/jni'
}
- 創(chuàng)建一個
NDKTest
類戏阅,加載庫并聲明native
方法:
package com.lichfaker.ndktest;
public class NDKTest {
static {
System.loadLibrary("ndk-test");
}
public static native String getString();
}
- 此時方法
getString()
是有錯誤提示的昼弟,按下alt+enter
創(chuàng)建native
方法(如果之前沒有指定sourceSets.main
則這里具體方法無法創(chuàng)建成功)如下:
- 定義
const char * returnValue = "Hello Jni";
并在Activity
中調(diào)用NDKTest.getString()
運行測試
- 運行測試拋出了異常:
java.lang.UnsatisfiedLinkError: Couldn't load ndk-test from loader dalvik.system.PathClassLoader...
猜測可能是運行平臺的原因,于是使用真機測試奕筐,但是然并卵...
于是google之舱痘,終于找到了原因:
原來gradle
默認是將編譯好的so文件放到libs
目錄下的, 而我們加載Library
的時候默認是去main
->jniLibs
下查找的离赫。
我這是修改了jniLibs
的默認路徑為libs
:
sourceSets.main {
// 你的源碼目錄
jni.srcDir 'src/main/jni'
jniLibs.srcDirs = ['libs']
}
- 重新打包運行芭逝,成功顯示
Hello Jni
_