使用ndk-build方式在as调用jni
在比较新的as上,调用jni有一些比较方便的方式比如使用cmake或者使用build工具,参考我博客中其他几篇文章
http://blog.****.net/findsafety/article/details/70053267
http://blog.****.net/findsafety/article/details/70053822
http://blog.****.net/findsafety/article/details/70059084
本文demo的地址为http://download.****.net/detail/findsafety/9843922
但还是希望能够用传统的方式来,这样在集成原来的eclipse项目也许会方便一点,所以这篇文章就是用ndk-build方式通过makefile来生成so进行调用
1 我们新建立一个项目,因为不想用新方式来调用jni ,所以不勾选include c++ support
2 在项目根目录下面的gradle.properties文件里面加上
android.useDeprecatedNdk=true
3 在src/main目录下面创建一个文件夹,名字叫做jni
4 在MainActivity里面声明native方法
public native String stringFromJNI();
5 点击菜单上的build -> make project ,这时候会在app/build/intermediates生成一个叫做classes的文件夹,里面会生成 MainActivity.class,这是我们下一步生成头文件的基础
6 点击底部的terminal栏,分别执行2个命令
cd app/src/main/java
javah -jni com.ksxx.testndkbuild.MainActivity
这样我们可以看到在java文件夹下面生成了一个.h文件
7 我们在jni文件夹下面创建一个.c文件,里面定义一个函数,函数的名称 返回值参照刚才生成的头文件
8 然后再在jni文件夹下面创建2个文件,分别为Android.mk和Applicaiton.mk
Android.mk文件里面
在这里LOCAL_MODULE是指你要生成的so文件的名字,LOCAL_SRC_FILES是指对应的c文件名字(都可以自己改的)
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY)
APP_ABI := all
9 再次进入terminal , 输入命令
cd ../jni
这样我们就进入到了jni目录,然后执行命令ndk-build
就会在app/main目录下面生成libs文件夹,里面会生成我们所需要的so文件
10 既然生成的so文件是在libs目录下面,而我们的java端要引用的话,是需要指定路径的,所以我们在build.gradle里面加入下面这段
sourceSets { main { jniLibs.srcDirs = ['src/main/libs'] } }
如果不想指定也可以,在app/src/main下面建立一个文件夹名字为jniLibs,这个文件夹会被as自动打包进去所以就不需要我们指定路径
11 在java层的MainActivity中加入so文件的加载语句
static { System.loadLibrary("hello"); }
我们在activity中设置显示文本为jni中返回的内容
这个时候我们run一下,就可以看到效果了