使用IDEA或者Android Studio可以進行ndk開發。
由於Android Studio是基於IDEA的,所以方法都是通用的。(eclipes請參考網上其他網友的博文)
1、搭建JNI環境
- 首先你需要有搭建好的SDK開發環境(JDK,SDK,IDEA或AS),環境變量都已經配置好,可以能夠進行正常使用。
下載好NDK。你可以通過科學上網下載,也可以下載國內的資源,也可以使用迅雷等添加下載地址進行下載。下面是r 10d的地址。
revision 10d
http://dl.google.com/android/ndk/android-ndk-r10d-windows-x86.exe
http://dl.google.com/android/ndk/android-ndk-r10d-windows-x86_64.exe
http://dl.google.com/android/ndk/android-ndk-r10d-darwin-x86.bin
http://dl.google.com/android/ndk/android-ndk-r10d-darwin-x86_64.bin
http://dl.google.com/android/ndk/android-ndk-r10d-linux-x86.bin
http://dl.google.com/android/ndk/android-ndk-r10d-linux-x86_64.bin解壓或安裝好NDK,並配置好環境變量。在系統環境變量裏面添加新變量
NDK_HOME
值爲你的NDK路徑。PATH中添加%NDK_HOME%
。- 檢查環境變量。CMD中輸入ndk-build看看能不能找到這個命令。
2、開始Hello,JNI!
- 在
local.properties
中添加NDK路徑。如下:
sdk.dir=C\:\\Android\\android-sdk-windows
ndk.dir=C\:\\Android\\android-ndk
- 新建一個普通的Android Project。Activity的類名爲MainActivity。
- 在類中添加一個native方法:
public native String getStringFromJni()
。 - make projct或者build project。
- 使用
javah
來生成*.h
頭文件。
1、建立jni文件夾:在module(通常名爲app)上右鍵->New->Folder->JNI Folder。如果已經存在則不需要添加。
2、 打開IDEA的Terminal窗口,默認是project根目錄,通過``cd app\src\main``進入main目錄。
3、 生成頭文件:``java h -d jni -classpath sdkdir\platforms\android-21\android.jar;..\..\build\intermediates\classes\debug com.example.testandroid.app.MainActivity``。
我的是``java h -d jni -classpath c:\Android\android-sdk-windows\platforms\android-21\android.jar;..\..\build\intermediates\classes\debug com.example.testandroid.app.MainActivity
``,後面解釋這個命令的含義。
4、 如果沒有保存,jni目錄下會生成頭文件``com_example_testandroid_app_MainActivity.h``。
- jni目錄下添加
.c
文件,名稱沒有限制,這裏我們使用main.c
。添加引用#include "com_example_testandroid_app_MainActivity.h"
你可以在上面生成的頭文件裏面最後找到native函數的聲明。複製到main.c文件中,添加實現。
// 頭文件中的生成函數聲明
/*
* Class: com_example_testandroid_app_MainActivity 類名
* Method: getIntFromJni 函數名
* Signature: ()I 函數簽名
*/
JNIEXPORT jint JNICALL Java_com_example_testandroid_app_MainActivity_getIntFromJni
(JNIEnv *, jobject);
// 我們的實現,一定不要忘了添加參數名
JNIEXPORT jstring JNICALL Java_com_example_testandroid_app_MainActivity_getStringFromJni
(JNIEnv *env, jobject obj)
{
return (*env)->NewStringUTF(env, "hello, jni!");
}
- 在
app/build.gradle
添加ndk配置
defaultConfig {
applicationId "com.example.testandroid.app"
minSdkVersion 9
targetSdkVersion 22
versionCode 1
versionName "1.0"
ndk {
moduleName "Myso";//生成的so文件名稱,可以不跟c文件同名
}
}
- 在MainActivity.java裏面添加引用
static {
System.loadLibrary("Myso");
}
// oncreate()中添加,顯示得到的字符串
Toast.makeText(this, getStringFromJni(), Toast.LENGTH_SHORT).show();
- 到此完成整個hello,jni。你可以運行看看效果了。
3、一些解釋
- javah命令:
javah -d jni -classpath classpath classname
。-classpath 需要完整的該類引用的所有jar文件路徑和生成的class文件目錄。 - java和jni的基本類型對應:http://www.cnblogs.com/nicholas_f/archive/2010/11/30/1892124.html
- c\c++獲取java String:
(*env)->NewStringUTF(env, "hello, jni!");