【NDK开发】JNI简介
来源:互联网 发布:手游网络格斗游戏 编辑:程序博客网 时间:2024/05/04 20:02
1、什么是JNI?
JNI,即Java Native Interface,Java本地编程接口,能够使得运行在虚拟机上的JAVA代码调用C/C++或者汇编语言,同时也支持被调用。当然,我们用的比较多的是JAVA调用C/C++。
参考:https://en.wikipedia.org/wiki/Java_Native_Interface
2、JNI基本框架
在JNI框架中,本地函数通常由C、C++实现,当JVM调用函数时,它将会传递JNIEnv指针、jobject指针及其他声明的相关参数。JNI函数可能是以下的这种形式:
JNIEXPORT void JNICALL Java_ClassName_MethodName(JNIEnv *env, jobject obj){ /*Implement Native Method Here*/}
其中,
1)JNIEnv *env指针为调用JVM相关接口提供指针,包括所有需要与JVM交互的与JAVA对象工作的函数,例如JNI函数将本地数组与JAVA数组互相转换,将本地字符串与JAVA字符串互相转换,实例化对象,抛出异常等等。
基本上,JAVA代码能够做的事情都可以用JNIEnv指针调用相应接口。
2)obj参数是调用该本地接口的JAVA对象的引用。
具体可参考如下实例。该函数对应于Java层的com.example包的testActivity类的Test函数。
//C++ codeextern "C"JNIEXPORT void JNICALL Java_com_example_testActivity_Test(JNIEnv *env, jobject obj, jstring javaString){ //Get the native string from javaString const char *nativeString = env->GetStringUTFChars(javaString, 0); //Do something with the nativeString //DON'T FORGET THIS LINE!!! env->ReleaseStringUTFChars(javaString, nativeString);}
C代码中,env的调用方式与C++不同。
/*C code*/JNIEXPORT void JNICALL Java_ClassName_MethodName (JNIEnv *env, jobject obj, jstring javaString){ /*Get the native string from javaString*/ const char *nativeString = (*env)->GetStringUTFChars(env, javaString, 0); /*Do something with the nativeString*/ /*DON'T FORGET THIS LINE!!!*/ (*env)->ReleaseStringUTFChars(env, javaString, nativeString);}
3、数据类型
基本上,基本数据类型几乎可以互换,但如果是复合类型如对象、数组及字符串,本地代码必须要显式的调用接口进行转换。
下面为本地数据类型及java数据类型的对应关系
Native TypeJava Language TypeDescriptionunsigned charjbooleanunsigned 8 bitssigned charjbyte signed 8 bitsunsigned shortjcharunsigned 16 bitsshortjshort signed 16 bitslongjintsigned 32 bitslong long jlong signed 64 bitsfloatjfloat 32 bitsdouble jdouble 64 bits需要注意的是:
unsigned char 对应于jboolean;
unsigned short对应于jchar 。
对于数组,则需要调用:
GetByteArrayElements 来获取指针及ReleaseByteArrayElements释放指针。
这两个函数必须配套使用,否则会出现内存溢出问题。
- 【NDK开发】JNI简介
- JNI/NDK开发流程简介
- Android NDK 开发(一)JNI简介及调用流程
- Jni+Ndk初次开发
- NDK CDT JNI开发
- AS开发NDK/JNI
- JNI 和NDK开发
- JNI NDK开发笔记
- JNI/NDK基础开发
- Android JNI/NDK 开发
- Android NDK开发简介 NDK和SDK以及JNI有什么关系?
- Android NDK开发简介 NDK和SDK以及JNI有什么关系?
- Android NDK开发简介 NDK和SDK以及JNI有什么关系?
- NDK开发 - JNI开发流程
- 【NDK开发】JNI与NDK关系
- android(NDK+JNI)---NDK开发 环境配置
- android NDK开发之NDK与JNI
- android(NDK+JNI)---jni开发资料
- RabbitMQ 入门二(hello world)
- 《Docker入门》:和我一起写Dockerfile
- sphinx里 java接口中对错误信息封装的一点记录
- Codeforces Educational Round 2 D题
- 2.5数字传输系统
- 【NDK开发】JNI简介
- Pull解析xml
- 让IE8支持CSS3属性(border-radius、box-shadow、linear-gradient)
- 第十四周实践项目2—二叉树排序树中查找的路径
- 杭电2099
- 添加TextView隐藏进度条的方法
- Java: byte short 如何正确异或!
- 结构体struct
- CSS 的优先级机制[总结]