什么是JNI:
JNI(Java Native Interface)提供了Java和其他语言交互的一个接口,为什么说是接口呢,因为如果你用想用C++实现一个简单的两个数字加减的方法并把值返回,那么就需要首先在AndroidJniUtils.java(就是你写的调用C代码的接口类)类中像定义接口方法一样来预定义一个方法,而具体实现其实使用的就是你的C代码了。
JNI的使用场景
①你的一些功能算法已经用c代码实现过了,可以直接用JNI调用而不用在java语言重新写一遍。
②你对某一些算法运算或图形渲染的性能要求很高,在优化了又优化之后你感觉java还是不能达到你最理想的速度,使用JNI调用c代码实现这个算法,那样会更快一些。
③对于Android API而言,你要调用API没有访问过的手机硬件,像手机上的摄像头,感光传感器,重力传感器,陀螺仪等设备Android的API已经提供了对应的类库,而如果现在你的手机上现在新增了一个硬件但是Android API没有对应的类库给你用呢,这时候你就要使用JNI调用C代码,然后通过C控制硬件来实现了。别忘了java是运行在虚拟机上的,是无法直接的访问底层硬件的。
一个在Android上使用JNI的例子
准备工作:
1.配置你的NDK路径:Android studio中.
如果你没有NDK的话它会提示你下载。我当时就是从这里下载的。
②在你的app下面的build.gradle文件中的defaultConfig节点下加入↓
ndk {
moduleName "MyJniLibName"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
③在你的gradle.properties最后面加上:android.useDeprecatedNdk=true
编写代码
1.编写带有native声明的方法的java类(也就是上文所说的AndroidJniUtils.java,当然名字任意起),注意这里面不要有中文注释,不然在进行下一步的时候会错误: 编码GBK的不可映射字符
public class AndroidJniUtils {
static {
System.loadLibrary("MyJniLibName");
}
public static native String getStringFromC();
}
2.使用javah -jni 包名.类名生成扩展名为.h的头文件
//cd到你的项目的java路径下:
cd cd G:\svn1320160320\AndroidJNIDemo\app\src\main\java
//生成头文件
javah -jni com.miser.androidjnidemo.JniUseUtil
3.在你项目的…\app\src\main\jni\文件夹下,新建一个xxx.c的文件然后将你刚才生成的.h结尾的文件内容复制到这个文件中。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_miser_androidusejni_AndroidJniUtils */
#ifndef _Included_com_miser_androidusejni_AndroidJniUtils
#define _Included_com_miser_androidusejni_AndroidJniUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_miser_androidusejni_AndroidJniUtils
* Method: getStringFromC
* Signature: (II)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_miser_androidusejni_AndroidJniUtils_getStringFromC
(JNIEnv *env, jclass jclass1, jint a, jint b) {
return (*env)->NewStringUTF(env, "欢迎光临我的博客:"
"\nhttp://blog.csdn.net/qq_27512671"
);
};
#ifdef __cplusplus
}
#endif
#endif
4.调用运行:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
TextView textView = (TextView) findViewById(R.id.text);
textView.setText(AndroidJniUtils.getStringFromC());
}
});
}
}
在你的项目编译完成之后就会生成动态链接库.so文件,这些文件可以在…\AndroidUseJni\app\build\intermediates\ndk\debug\lib中找到
Demo地址:http://download.csdn.net/detail/qq_27512671/9498210