使用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!");