- DNK环境搭建
- 创建HelloJni工程
- 可能出现的问题
DNK环境搭建
参考上一篇 Android NDK环境配置
创建HelloJni工程
1.新建Android Application Project,命名HelloJni。主包名为com.kongge.hellojni.(命名随便,这里便于下面叙述)
2.鼠标右击工程名,找到 Android Tools-> Add Native Support…会弹出一个框,Library Name:Lib。这里可以随便填一个,例如我填的就是HelloJni,这个在后面加载库时会用到。此时会生成几个文件夹:jni,obj等。
3.创建包 com.kongge.hellojni.bean,创建类 Person.java
public class Person {
static{
System.loadLibrary("HelloJni"); //HelloJni就是上面Lib的名称
}
public native int getSum(int a, int b); // native关键字,表示调用jni
}
4.找到 jni 文件夹里面的.cpp文件,由于上面的Lib命名为HelloJni,所以这里是HelloJni.cpp。这里以计算 a +b 为例。
extern "C"{
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
JNIEXPORT jint JNICALL Java_com_kongge_hellojni_bean_Person_getSum(JNIEnv* env, jobject obj, jint a, jint b){
return a + b; //此处可能出错,往下看。
}
}
5.此时.cpp文件会出现错误,右击工程名 Properties -> C/C++ Build,将Use default build command勾去掉,下面的Build command填:${NDK_ROOT}/ndk-build.cmd。NDK_ROOT在环境变量里面配过,见上方NDK环境配置。点击OK。.cpp文件就没有报错了。
6.在MainActivity中调用。
Person person = new Person();
System.out.println("4 + 6 = " + person.getSum(4,6));
7.点击运行,LogCat就会输出 4 + 6 = 10。大功告成!
可能出现的问题
- 1.包名类名问题.
- .cpp 文件中 Java_com_kongge_hellojni_bean_Person_getSum方法,”Java_”代表调用java方法;”getSum”代表java类中声明的native方法名;”Person”代表调用getSum方法的类名,与方法名用”“隔开;”com_kongge_hellojni_bean” 代表Person类的包名,中间的”.”使用”“代替;若是方法名中有下划线get_Sum(),则对应的为Java_com_kongge_hellojni_bean_Person_get_1Sum();
- 2.虚拟机运行不起来,INSTALL_FAILED_CPU_ABI_INCOMPATIBLE
- 我使用的是genymotion虚拟机,这个错误是由于虚拟机是x86的处理器,但是eclipse编译出来的app只能在arm架构上面运行,下载ARM补丁然后拖入虚拟机,一路点击ok然后重新启动虚拟机即可。
- 3.补丁已经装好了,但是运行崩溃。
- 在 jni 目录下面新建Application.mk,然后写入下面代码:APP_ABI := armeabi armeabi-v7a x86 即可。
4.javah 命令的使用。
打开cmd 进入到getSun()方法的包的外层目录,一般为src,然后使用 javah com.kongge.hellojni.bean.Person。此时会生成一个.h头文件,里面有
JNIEXPORT jint JNICALL Java_com_example_hellojni_MainActivity_getSum (JNIEnv *, jclass, jint, jint);
将该文件移动至jni目录下面,在.cpp文件中引入,并实现该方法。