之前也对JNI和NDK做了详解,接下来,对它的使用做一个详细的介绍
配置环境变量
安装好的NDk一般位于你的sdk文件夹下的ndk-bundle。可以看到里面有ndk-build文件,下文进行编译的时候我们会用到。
然后将该路径配置到你系统变量的path里面去,如下:
1.在系统环境变量里面创建NDK_ROOT
2.将NDK_ROOT追加到Path环境变量下–>;%NDK_ROOT%
添加完毕后打开cmd,输入ndk-build,出现如下内容则表示成功(如下图所示)。
3.JNI的使用方法
新建“本地”方法
编译该类得到对应的.h文件
切换到Terminal(如下图所示)。
方式一:输入javah -jni -encoding utf-8包名.类名
自己之前用这种方法,.h文件无法生成,老是报找不到文件;如果你这种方法无法使用,可以换另一种(如下)。
方式二:在cmd中找到你的项目地址,并输入javah -jni -encoding utf-8包名.类名
编译成功后,,,,就可以看到.h文件(如下图)
.h文件中:
其实重要的部分就是这一句代码:
JNIEXPORT jstring JNICALL Java_cn_handsomedragon_testndk_MainActivity_getStrFromJNI(JNIEnv *, jobject);
仔细观察可以看到他是遵循“Java_包名类名本地方法名”来组织的(了解到这些后我们以后就可以不生成.h文件然后直接去写.c文件了)。
编写.c文件
在app目录下新建jni文件夹,并在里面建立一个demo.c的c文件
在文件中编写代码:
#include
jstring JNICALL Java_cn_handsomedragon_testndk_MainActivity_getFromJNI(JNIEnv *env,jobject thiz) {
return (*env)->NewStringUTF(env, "I`m Str from jni libs!");
}
这是就可以看出我们用的是.h中的那行代码,稍微修改为如上格式就是我们所需要的.c文件了
编写Android.mk文件
在jni目录下新建Android.mk(必须是这个名称Android.mk)文件
如:上图中jni文件夹下面的Android.mk文件
文件中的代码编写:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := demo//要生成的so库的名称,但实际为libdemo.so
LOCAL_SRC_FILES := demo.c//要使用的文件,刚才编写的demo.c文件
include $(BUILD_SHARED_LIBRARY)
*注:编译时,记得把.mk中的注释去掉(不能写注释)
编译.so文件
编译完成后,刷新项目工程:可以看到在app目录下生成的libs和obj文件夹,其中libs是有用的,obj文件夹无用可以删除。libs中的可以看到生成的libdemo.so文件。
最后两个最重要的配置
1.在local.properties中设置NDK路径
2.在app的build.gradle的android节点下设置
运行项目,看控制台,如果打印如下,说明成功了。。。。