Android JNI 使用讲解

(一) 什么是JNI?

JNI,全称为Java Native Interface,即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互。即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI是JVM规范的一部分,因此可以将我们写的JNI的程序在任何实现了JNI规范的Java虚拟机中运行。同时,这个特性使我们可以复用以前用C/C++写的大量代码JNI是一种在Java虚拟机机制下的执行代码的标准机制。代码被编写成汇编程序或者C/C++程序,并组装为动态库。也就允许非静态绑定用法。这提供了一个在Java平台上调用C/C++的一种途径,反之亦然。

PS:
开发JNI程序会受到系统环境限制,因为用C/C++ 语言写出来的代码或模块,编译过程当中要依赖当前操作系统环境所提供的一些库函数,并和本地库链接在一起。而且编译后生成的二进制代码只能在本地操作系统环境下运行,因为不同的操作系统环境,有自己的本地库和CPU指令集,而且各个平台对标准C/C++的规范和标准库函数实现方式也有所区别。这就造成了各个平台使用JNI接口的Java程序,不再像以前那样自由的跨平台。如果要实现跨平台, 就必须将本地代码在不同的操作系统平台下编译出相应的动态库。

(二) 为什么需要JNI

因为在实际需求中,需要Java代码与C/C++代码进行交互,通过JNI可以实现Java代码与C/C++代码的交互


(三) JNI的优势

与其它类似接口Microsoft的原始本地接口等相比,JNI的主要竞争优势在于:它在设计之初就确保了二进制的兼容性,JNI编写的应用程序兼容性以及其再某些具体平台上的Java虚拟机兼容性(当谈及JNI时,这里并不特比针对Davik虚拟机,JNI适用于所有JVM虚拟机)。这就是为什么C/C++编译后的代码无论在任何平台上都能执行。不过,一些早期版本并不支持二进制兼容。二进制兼容性是一种程序兼容性类型,允许一个程序在不改变其可执行文件的条件下在不同的编译环境中工作。


(四) JNI的命名规则

JNIExport jstring JNICALL Java_com_example_hellojni_MainActivity_stringFromJNI( JNIEnv* env,jobject thiz )

jstring 是返回值类型
Java_com_example_hellojni 是包名
MainActivity 是类名
stringFromJNI 是方法名

其中JNIExport和JNICALL是不固定保留的关键字不要修改


(五) 如何实现JNI

JNI开发流程的步骤:
第1步:在JNIFileTest/src/com/haige/jnifiletest目录下新建JNIFileTest.java文件,在JNIFileTest.java中先声明一个native方法

public class JNIFileTest {

    public native int owlGpioInit();
    public native int owlIoctrl(int which, int status);
    public native void owlGpioCleanup();

}


第2步:编译Java源文件javac得到.class文件

JNIFileTest/src/com/haige/jnifiletest$ javac JNIFileTest.java


第3步:通过javah -jni命令导出JNI的.h头文件

JNIFileTest/src$ javah com.haige.jnifiletest.JNIFileTest

第4步:拷贝头文件到jni目录

JNIFileTest/src$ cp om.haige.jnifiletest.JNIFileTest.h ../jni/


第5步:使用Java需要交互的本地代码,实现在Java中声明的Native方法(如果Java需要与C++交互,那么就用C++实现Java的Native方法。)

在jni目录下新建JNIFileTest.c,一一实现JNIFileTest.java中声明一个native方法。


第6步:将本地代码编译成动态库(Windows系统下是.dll文件,如果是Linux系统下是.so文件,如果是Mac系统下是.jnilib)

通过mmm命令编译 JNIFileTest5/jni

PS:具体操作参考附件的Android JIN Demo(APK控制底层GPIO的高低电平)

猜你喜欢

转载自blog.csdn.net/Chris_1994/article/details/134332569
今日推荐