在AndroidStudio新建一个JNI工程,(这里省事,就在一个其它Demo中进行测试了)
�
截图中,包括对即将要生成的JNI库的标识声明,与JNI库要提我给我们的方法作native声明
然后通过JNITool.java文件生出.h文件
具体做法
cd ***/app/src/main/java //cd到你项目中的java目录
javah -d ../jni/ com.chris.custom.JNITool //将.h文件生成到main同级的jni目录下
生成的.h文件名称为:com_chris_customview_JNITool.h
文件存放在刚刚创建的jni目录下,下面的一部分操作,我们直接在jni下操作
看到方法名子很长.他的命名规则:Java_包名_类名_方法名.
有了头文件,我们创建source文件,我们选择通过C++实现,起名JNICppTool.cpp
include进我们JNI的.h文件们实现方法(当然,如果不需要javah创建head file,可以直接编写C/C++Source文件,也可以).
我们在编写Android.mk,Application.mk(我们只有一个测试so,并对这个so生成的平台不关心,这个文件可以直接忽略).
Android.mk的文件内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jni-tool
LOCAL_SRC_FILES := tool.cpp
include $(BUILD_SHARED_LIBRARY)
配置好你的NDK环境(我在MAC上测试,因为硬盘空间小,把NKD放到U盘上了,为了做测试,把NDK又拷进MAC,4G+呀,测完后,还是要删除的)
跳进jni目录,执行ndk-build.会在jni同级目录下生成libs目录,里面存放着各个平台的so包,
然后把libs目录下的所有文件包括文件夹剪切到jni同级目录下jniLibs(没有的话,创建,这是AS默认目录)
在app的build.gradle中的buildTypes节点上加,目的是让AS的gradle进行编译时,对jni部分进行编译
sourceSets{
main{
jni.srcDirs=[]
}
}
这时候,再执行项目,我们会看到在调用JNITool类的get()方法时,可以看到
JNITooljniTool= newJNITool();
System.out.println(jniTool.get());
03-09 14:04:28.894 1328 1328 I System.out: C++ is server....
这时候我们的JNI,在Android平台上的整个流程打通了.
过程中遇到了几个问题,比如ndk-build执行失败,目录文件不清楚,还是自行google,百度解决吧.