本文是基于维基百科中JNI英文文档翻译而来。
E文文档地址:http://en.wikipedia.org/wiki/Java_Native_Interface
一、缺陷
1.使用JNI细小的错误都能让这个JVM不稳定,并且这些错误很难再现和调试
2.使用JNI的应用失去了JAVA本身提供的不同平台的可移植性。
3.JNI 框架不提供自动的垃圾回收机制,所以这部分代码要考虑内存的释放
4.在linux 和solaris 平台,信号量过滤器会认为本地代码会处理信号量比JVM更好,所以如果本地代码注册自己为单处理(signal handler),他们就能够拦截到JVM的信号量。
5.在没有处理的异常中所有可能成为结果的都可能出现一些中断(比如空指针,除数为零),为了在中断到达JVM之前处理这些情况,在windows 平台,在try/catch 块中SHE(Structured Exception Handing)可能被使用去包装本地代码,以便获得机器(CPU/FPU)生成的软中断。
6.编码相关的方法是通过UTF-8修改而来:NewStringUTF, GetStringUTFLength, GetStringUTFChars, ReleaseStringUTFChars, GetStringUTFRegion,不是标准的UTF-8方法。程序应该使用NewString,GetStringChars,ReleaseStringChars, GetStringRegion, GetStringCritical, ReleaseStringCritical 方法,这些方法使用UTF-16LE 小尾端(little-endian)架构和UTF-16BE大尾端架构,然后用UTF-16到标准的UTF-8的转换。
二、类型映射
JNI基本类型和本地代码的类型映射
unsigned char | jboolean | unsigned 8 bits | Z |
signed char | jbyte | signed 8 bits | B |
unsigned short | jchar | unsigned 16 bits | C |
short | jshort | signed 16 bits | S |
long | jint | signed 32 bits | I |
long long |
jlong | signed 64 bits | J |
float | jfloat | 32 bits | F |
double | jdouble | 64 bits | D |
void | V |
以上基本数据类型和本地代码可以直接使用,但是对于字符串和数组来说需要经过相应的转换才行
字符串
JNIEXPORT void JNICALL Java_ClassName_MethodName (JNIEnv *env, jobject obj, jstring javaString) { // printf("%s", javaString); // INCORRECT: Could crash VM! // Correct way: Create and release native string from Java string const char *nativeString = (*env)->GetStringUTFChars(env, javaString, 0); printf("%s", nativeString); (*env)->ReleaseStringUTFChars(env, javaString, nativeString); }
数组
JNIEXPORT jint JNICALL Java_IntArray_sumArray (JNIEnv *env, jobject obj, jintArray arr) { jint buf[10]; jint i, sum = 0; // This line is necessary, since Java arrays are not guaranteed // to have a continuous memory layout like C arrays. env->GetIntArrayRegion(arr, 0, 10, buf); for (i = 0; i < 10; i++) { sum += buf[i]; } return sum; }
关于JNIEnv
JNIEnv 是JNI方法的第一个参数,他提供了JNI环境和本地环境的相互作用,JNIEnv指针可以保存,但是之在当前线程才是合法的,其它线程必须先调用AttachCurrentThread()把当前依附到JVM上然后得到一个JNIEnv 的指针,之后这个本地线程就像一个JAVA线程一样工作了, 调用DetachCurrentThread()解除依附。
JNIEnv *env; (*g_vm)->AttachCurrentThread (g_vm, (void **) &env, NULL); (*g_vm)->DetachCurrentThread (g_vm);
相关推荐
jni数据类型转换例程 1. java向native传递常用基本数据类型 和字符串类型 2. java向native传递数组类型 3. java向native传递自定义java对象 4. java向native传递任意java对象(以向native传递ArrayList为例) 5....
08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08...
jni java类与c++类映射的例子
JNI处理各种类型数据,不包含获取Java的HashMap;包含了java的工程和c++工程,可以查看代码,可以直接运行;同事包含了在网络上找的一些资料。
JNI中C和Java参数传递详细例子,各种数据类型,基本类型,数据,结构体,DEMO,非常适合初学者,一看就明,详细例子
Java与JNI数据类型对照表,可能有许多不足之处,请大家参考一下。
学习JNI编译时,缺少的jni.h和jni_md.h头文件,Java调用C和C++函数时的JNI使用区别: 注意:jni.h头文件中对于***.c & ***.cpp采用不同的定义
JNI的两个头文件jni.h和jni_md.h,提供需要的人下载!!!!!
a) 将java参数类型转换为jni提供的类型,包含:基础类型转换为jint,jlong,jboolean,jbyte等类型;String 转换为jstring类型;其他内置类型及自定义类型全部转换为jobject; 一般情况下,java调用native方法会比...
本文件是 JNI 传递和返回基本参数的 Demo,详细介绍见博客:https://blog.csdn.net/u011520181/article/details/79765336,无法资源分设置 0 分,也可以去博客下面的 github 地址下载
《Android JNI 视频系列>共分为四期: Jni简单demo Jni基本数据类型和方法介绍 Jni解析java自定义数据类型和回调java方法 Jni performance提高和Exception规避
一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList<ArrayList<String>>等。
JNI复杂类型转换
android C/C++ JNI普通数据类型 测试工程, 最好配合文章看《Android JNI C/C++编程--数据类型》
java jni 与 c++ 数据类型转换 及调用
JNI处理String[]等特殊类型的数据,别处绝对中不到的
内容包含了jni的介绍和作用,jni在android系统中的具体应用,jni的编写和编译技术,hal的介绍,hal的编写技术
Chap7:Jni中C++和Java的参数传递... 33 Chap8:如何将java传递过来的jbyteArray转换成C/C++中的BYTE数组... 47 Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能... 47 Chap9:如何编写jni方法(转载...
JNI开发Java调用C传递int、String、Array类型参数; 详情参考: int类型: (https://blog.csdn.net/niuba123456/article/details/80959892) String类型(https://blog.csdn.net/niuba123456/article/details/80977247);...