JNI开发笔记一
2016-01-28 本文已影响111人
BlainPeng
1、创建一个类,在类里面声明一个本地方法
public class JNIUtils {
//在c语言中对两个数求和
public static native int getNumSum(int a ,int b);
}
2、设置ndk的路径和.so的名称
- 点击File->ProjectStructure,配置好ndk的路径(最好是先把ndk下载到本地)如下图:
-
在模块的目录下找到build.gradle文件,将以下部分
ndk{ //.so的名称:testjni moduleName"testjni" //适配了三种平台,一般armeabi平台比较多,可以只写一种 abiFilters"armeabi","armeabi-v7a","x86" }
添加到defaultConfig大括号内
-
在grade.properties文件内的末尾处添加一句代码,不然studio会报错
android.useDeprecatedNdk=true
3、生成头文件
-
先点击Build->Make Project,再打开模块目录下的build文件夹,会生成一个文件夹classes,点击打开,找到一个debug的文件夹
-
打开studio的Terminal,先进入到debug文件夹中,输入:
cd app/build/intermediates/classes/debug
-
再输入:
//javah -jni 类的全名 javah -jni com.blainpeng.jnidemo.JNIUtils
此时会在debug文件下生成一个.h文件
4、java层开始调用c/cpp中的函数
-
在main目录下新建一个名为jni的文件夹,然后jni目录下新建一个.c或.cpp文件,将上面生成的.h文件中的方法剪切到jni目录下,并且在.c/.cpp里面include该头文件
#include "com_blainpeng_jnidemo_JNIUtils.h" //c中求和的方法 int sum(int a, int b){ return a+b; } JNIEXPORT jint JNICALL Java_com_blainpeng_jnidemo_JNIUtils_getNumSum (JNIEnv *env, jclass clazz, jint ja, jint jb){ return sum(ja,jb); }
-
写完逻辑后,再rebuild一次,再次点击build->intermediates,找到一个ndk的文件夹,点击它,查看是否有生成.so文件
-
在android代码中调用本地方法,需先加载so文件,可以通过静态代码块的方式来加载
static { System.loadLibrary("testjni"); }
-
再调用本地方法:
int numSum = JNIUtils.getNumSum(4, 9);
得到结果:
result.png好了,JNI的简单入门就结束了。