JNI 各类数据类型处理
JNI和java数据类型转换:
1、基本数据类型
下面一张表是描述了 Java 基本数据类型和JNI中基本数据类型的相对应关系已经占用空间大小。
随便观察就能发现,其实就基本数据类型而已,JNI基本数据类型只是比Java基本数据类型前多了个’j’而已
当然,JNI中还有个Java中没有的jsize,定义如下:
typedef jint jsize;
其实jsize整型是用来描述基本指标和大小,没有什么神秘的。
2、引用数据类型
JNI 引用类型 与 Java 的对应关系 如下 树层次图:
跟java一样,jobject 是所有引用类型的 父亲。看看是不是很容易理解 ?呵呵.关于jthrowable,JNI也是有线程概念的.
3、 The jvalue Type
Jvalue 是基本数据类型和引用数据类型的集合,它的定义如下:
typedef union jvalue {
jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
Java类型和本地类型对应
在如下情况下,需要在本地方法中应用java对象的引用,就会用到类型之间的转换:
1)java方法里面将参数传入本地方法;
2)在本地方法里面创建java对象;
3)在本地方法里面return结果给java程序。
分为如下两种情况:
Java原始类型
像booleans、integers、floats等从Java程序中传到本地方法中的原始类型可以直接使用,下面是java中的原始类型和本地方法中的类型的对应:
Java类型 本地类型 字节(bit)
boolean jboolean 8, unsigned
byte jbyte 8
char jchar 16, unsigned
short jshort 16
int jint 32
long jlong 64
float jfloat 32
double jdouble 64
void void n/a
也就是说如果我在方法中传进去了一个boolean的参数的话,那么我在本地方法中就有jboolean类型与之对应。同理,如果在本地方法中return一个jint的话,那么在java中就返回一个int类型。
下面是访问String的一些方法:
◆GetStringUTFChars将jstring转换成为UTF-8格式的char*
◆GetStringChars将jstring转换成为Unicode格式的char*
◆ReleaseStringUTFChars释放指向UTF-8格式的char*的指针
◆ReleaseStringChars释放指向Unicode格式的char*的指针
◆NewStringUTF创建一个UTF-8格式的String对象
◆NewString创建一个Unicode格式的String对象
◆GetStringUTFLengt获取UTF-8格式的char*的长度
◆GetStringLength获取Unicode格式的char*的长度
JNIEXPORT jint JNICALL Java_com_test_funcName(JNIEnv *jenv, jclass jcls,
jstring jstrData,
jobjectArray jstrDatas,
jfloatArray jfloatData,
jbyteArray jbyteData
){
int strLength = (jenv)->GetStringLength(jstrData);
const char* strData = jenv->GetStringUTFChars(jstrData, 0);
const jchar* jcstr = (env)->GetStringChars(jstrData, 0);
// get objectArray elements
jsize dataLength = jenv->GetArrayLength(jstrDatas); // get data length
for (int i=0; i<dataLength; i++){
jstring js =(jstring)env->GetObjectArrayElement(jstrDatas, i);
}
// assign string array to objectArray
for (int i=0; i<10; i++){
jstring jstrElement = jenv->NewStringUTF(cStrData.c_str());
jenv->SetObjectArrayElement(jstrDatas, i, jstrElement);
jenv->DeleteLocalRef(jstrElement);
}
// or assign string array to objectArray
// jclass jstrCls =env->FindClass("Ljava/lang/String;");
// jstrDatas = (jobjectArray)jenv->NewObjectArray(
// 5, //num elements
// jstrCls, // java str class
// env->NewStringUTF(cStrData.c_str()) // init data, or set NULL
// );
jfloat* floatData = jenv->GetFloatArrayElements(jfloatData, 0); //get data point
jbyte* byteData = jenv->GetByteArrayElements(jbyteData, 0);
string cStrData = "JNI-test";
if (jstrData)
(jenv)->ReleaseStringChars(jstrData, jcstr);
if (jstrData)
jenv->ReleaseStringUTFChars(jstrData, strData);
if (jbyteData)
jenv->ReleaseByteArrayElements(jbyteData, byteData, 0);
if (jfloatData)
jenv->ReleaseFloatArrayElements(jfloatData, floatData, 0);
return (jint)0;
}
参考:http://blog.163.com/hero_213/blog/static/398912142012011325273/
posted on 2018-03-15 16:09 Sanny.Liu-CV&&ML 阅读(593) 评论(0) 编辑 收藏 举报