JNI层基本数据类型:
jboolean, jbyte, jchar, jshort, jint,jlong, jfloat, jdouble
JNIEXPORTjstring JNICALL
Java_Prompt_getLine(JNIEnv*env, jobject this, jstring prompt);
其中:
JNIEnv 为JNI函数表结构
jobject 的意义取决于该方法是静态还是实例方法。如果是实例方法,则相当于对象本身,如果是静态方法,则指向所在类
第三个参数是一个对象,为本节讨论的重点。Java层对象作为一种C类型的指针传递到JNI层,它指向JavaVM内部数据结构。对指针所指结构的操作,都要通过JNI方法进行。
jstring对象及其操作:
jstring prompt;
jstring newJString;
jbyte *str =(*env)->GetStringUTFChars(env, prompt, NULL);
char buf[32] = “hello”;
if(str != NULL) {
printf(“%s”, str);
(*env)->ReleaseStringUTFChars(env,prompt, str);
}
newJString = (*env)->NewStringUTF(env,buf);
summaryof JNI jstring functions
GetStringChars ReleaseStringChars 获得或释放一个unicode的string
GetStringUTFChars ReleaseStringUTFChars 获得或释放一个utf-8的string
GetStringLength
GetStringUTFLength
NewString new一个unicode的java string
NewStringUTF new一个utf-8的java string
GetStringCritical ReleaseStringCritical
GetStringRegion SetStringRegion
GetStringUTFRegion SetStringUTFRegion
JNI数组访问
JNIEXPORTjint JNICALL
Java_IntArray_sumArray(JNIEnv*env, jobject obj, jintArray arr) {
jint buf[10];
jint I, sum = 0;
(*env)->GetIntArrayRegion(env, arr,0, 10, buf);
for(I = 0; I < 10; i++) {
sum += buf[i];
}
return sum;
}
JNIEXPORTjint JNICALL
Java_IntArray_sumArray(JNIEnv*env, jobject obj, jintArray arr) {
jint *carr;
jint I, sum = 0;
carr = (*env)->GetIntArrayElements(env,arr, NULL);
if(carr != NULL) {
for(I= 0; I < 10; i++) {
sum += buf[i];
}
(*env)->ReleaseIntArrayElements(env,arr, carr, 0);
}
return sum;
}
Summaryof JNI Primitive Array Functions
Get<Type>ArrayRegion Set<Type>ArrayRegion
Get<Type>ArrayElements Release<Type>ArrayElements
GetArrayLength
New<Type>Array
GetPrimitiveArrayCritical ReleasePrimitiveArrayCritical