关于JNI开发的学习

    科技2022-08-04  125

    笔记

    在linux下写代码如何能跟JAVA程序进行交互?现在接触到的方法就是通过JNI接口函数,其实就相当于在C端写好函数的实现,形成一个接口,java端也声明一个本地方法,函数名字和参数跟C端一样吧?我是这样理解的,然后将C端的代码编译成动态库,java直接调用动态库里的接口就可以实现java和C交互了,实际的底层工作还是C来完成的。如果涉及安卓开发,应为安卓也是用java做开发嘛,linux端编译动态库要注意交叉编译,这个时候编译的动态库所依赖的一些其他的动态库,例如标准C库或者math数学库,这些都不能直接用linux本地的库了,要用NDK工具中对应的动态库,所谓对应就是看你最终动态库运行的平台,NDK工具包中有各个平台的库文件和头文件。

    什么是NDK NDK 是Native Develop Kit的含义,从含义很容易理解,本地开发。大家都知道,Android 开发语言是Java,不过我们也知道,Android是基于Linux的,其核心库很多都是C/C++的,比如Webkit等。那么NDK的作用,就是Google为了提供给开发者一个在Java中调用C/C++代码的一个工作。NDK本身其实就是一个交叉工作链,包含了Android上的一些库文件,然后,NDK为了方便使用,提供了一些脚本,使得更容易的编译C/C++代码。总之,在Android的SDK之外,有一个工具就是NDK,用于进行C/C++的开发。一般情况,是用NDK工具把C/C++编译为.so文件,然后在Java中调用。

    作者:隔壁老李头 链接:https://www.jianshu.com/p/87ce6f565d37 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    什么是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程序,不再像以前那样自由的跨平台。如果要实现跨平台, 就必须将本地代码在不同的操作系统平台下编译出相应的动态库。

    作者:隔壁老李头 链接:https://www.jianshu.com/p/87ce6f565d37 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    如何识别JNI接口 linux下面写代码,怎么就认识你写的接口是JNI了呢?我的理解是根据头文件jni.h和你的命名方式决定的。jni接口有他自己的命名方式,就像写proc代码一样,要想在代码里引入数据库相关数据要写 EXEC EXPORT一样,JNI也是这样实现的 JNIEXPORT jint JNICALL Java_cmri_CmriMessageFrame_decode_1to_1byte( JNIEnv *env, jobject obj, jbyteArray uperin, jbyteArray byteout, jint size) JNIEXPORT 和 JNICALL固定不变,这个应该就是识别他是JNI接口的关键所在 后面的基本跟函数的声明一致 jint 是返回值类型 也可以是其他类型 像jstring(linux里应该没有这个, jni头文件里声明的吧 我猜的) 后面函数名字又分包名Java_cmri 类名CmriMessageFrame 方法名decode_1to_1byte(我根据自己的理解猜的,具体没跟JAVA同时确认过)

    Processed: 0.010, SQL: 8