jni编程指南,jni类型
在之前的文章中,作者介绍了C中的一些相关知识点,如指针、引用、智能指针、多线程、类型转换、异常处理等。要想熟练掌握并运用到实际项目中,光看是肯定没用的,纸上谈兵永远比不上脚踏实地的现实。
以下是对之前文章的回顾:
c语言RVO返回值的优化
c的Const关键字
c的指针读写能力
c智能指针
c语言的指针和引用
c语言的右值参考
c语言的类型转换
C语言的多线程之一
c多线程2
c #的异常处理
从今天开始,文章的内容将是一系列有关JNI介绍的文章。
JNIJNI是Java Native Interface的缩写,俗称Java本地接口。它是Java语言为Java和C/C相互通信提供的一种机制。Java可以通过JNI调用本地C/C代码,本地C/C代码也可以通过JNI调用Java代码。
在什么情况下可以使用JNI?
1.当需要提高性能时,例如,进行一些底层开发,如音频和视频处理,通常使用JNI。
2.增加破/解的难度。比如需要升级代码的保护级别,一些敏感信息需要隐藏在底层。
3.当你需要使用一些成熟的底层C/C库的时候。
NDK需要NDK在Android上使用JNI,NDK是一个工具集合,提供一系列工具帮助开发者快速交叉编译C/C代码,生成可以在Android上运行的动态库或静态库。比如我们要把基于C的音视频处理库FFmpeg移植到Android平台,就需要使用NDK进行交叉编译。
动态库和静态库1、静态库
静态库意味着在链接阶段,编译器将。o用库文件汇编生成目标文件,并把它们打包成可执行文件,或者把它们链接在一起生成最终的可执行文件。因此,相应的链接方式称为静态链接。
由于静态库在编译时连接库文件,静态库存存在可执行文件大、更新维护不方便等问题。
2.动态图书馆
动态库也称为共享库,或动态链接库。动态库在程序编译时不会链接到目标代码,只会在程序运行时加载。如果不同的应用程序想要调用同一个库,只需要在内存中有一个共享库的副本,这样就避免了空间浪费的问题。而且动态库是在程序运行时才加载的,所以与静态库相比,动态库具有更新和部署方便的优点。
由于动态库的这些优点,目前大多数SDK一般都有动态库的方式。
一个简单的JNI函数我们用Android Studio新建一个原生C项目,系统会自动为我们创建一个最简单的JNI函数。当然,不同的包名会产生不同的JNI函数名,比如:
extern C JNI export jstring JNI call
Java _ com _ fly _ jnitest _ main activity _ stringFromJNI(
JNIEnv* env,
作业对象){
STD:string Hello= Hello from C ;
返回env-NewStringUTF(hello . c _ str());
}1、外部“C”
第一个出现在JNI函数中的是extern‘C’。这是什么意思?其实这个写过C/C代码的人大概都知道,就是要在C中兼容C代码,避免编译器用C的方式编译C函数。
这是因为在C中,支持函数重载,所以在C中,函数标识是通过函数名、函数返回类型和函数参数列表的组合来完成的;而C中不支持函数重载,所以用C语言代码编译函数时,不包括函数的参数类型,一般只包括函数名。所以需要使用extern C 来使C能够调用C编写的库文件。
2、jstring
这个没什么好说的。这是函数的返回值。
3、JNIEXPORT
JNIEXPORT是一个宏,在不同的平台上有不同的定义。它的主要作用是保证在这个库中声明的方法可以在其他项目中调用。
比如attribute _ _((visibility( default ))表示外部可见性,类似于public修饰符(即可以外部调用),attribute _ _((visibility( hidden ))表示隐藏,类似于private修饰符(即只能内部调用)。
4、JNICALL
JNICALL也是一个宏,在不同的平台上也有不同的定义。用来表示函数的调用规范(比如__stdcall)。目前在linux平台上还是一个空定义。
4.函数名
在上面的例子中,函数名是Java _ com _ fly _ jnitest _ main activity _ stringfromjni,这是一个静态注册的函数名。它与。它们的对应关系是:
Java_包名_类名_方法名5,JNIEnv
JNIEnv*是一个指向JVM函数表的指针。JNIEnv代表Java环境。通过JNIEnv*,可以操作Java端的代码,比如创建Java对象,访问Java对象方法,获取Java对象的属性等。
简言之,它是Java方法和C/C方法之间的桥梁。
请注意,JNIEnv指针只在其关联的线程中有效。不能将这个指针从一个线程传递到另一个线程,也不能缓存并在多个线程中使用。Java虚拟机在同一个线程中传递相同的JNIEnv指针给本地方法,但是从不同的线程调用本地方法时传递不同的JNIEnv指针。
6、作业项目
Jobject表示定义本机函数的Java类的对象实例,如果的方法是静态方法,则为jclass。
在JNI,每个Java的基本数据类型与C/C的基本数据类型形成映射关系
下图显示了Java和JNI中基本数据类型之间的映射关系:
JNI以不透明的方式将对象传递给本机代码,不透明引用指的是指向Java虚拟机内部数据对象的C语言指针。本机代码必须通过JNIEnv中定义的函数来处理这些内部数据对象。比如java.lang.String对应的JNI对象是jstring.jstring真实值与本机代码无关。本机代码通过GetStringUTFChars访问Java字符串的内容。
的所有JNI引用都属于jobject类型。为了提高类型安全性,保证使用的便利性,JNI定义了一系列引用类型,这些引用类型在概念上是Jobject的子类型。这些子类型与Java语言中最常用的类型相关联。比如jstring对应string,jobjectArray对应object数组。下图显示了JNI引用类型及其与所有子类型的继承关系列表:
作为开题,本文简单介绍了JNI的一些基础知识,我们将在后面的章节中介绍更多JNI的用法。
关注我,共同进步,生活不止编码!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。