Java中数据类型分两类:
primitive types 如int , float , char
reference types 如类,实例, 数组
boolean jboolean
byte jbyte
char jchar
short jshort
int jshort
long jlong
float jfloat
double jdouble
Object jobject
Class jclass
String jstring
boolean[] jbooleanArray
其他对应
const jchar * GetStringChars(JNIEnv *env, jstring str, jboolean *isCopy) 得到Unicode编码的String指针
void ReleaseStringChars(JNIEnv *env, jstring string, const jchar *char) 释放
const jbyte *GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy) 得到UTF编码String指针
void ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *uft)释放
jsize GetStringLength(JNIEnv *env, jstring string)
jsize GetStringUTFLength(JNIEnv *env, jstring string)
jstring NewString(JNIEnv *env, const jchar *uchars, jsize len)
jstring NewStringUTF(JNIEnv *env, const jchar *uchars, jsize len)
const jchar * GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy)得到编码格式的String指针,返回String的copy值
void RealeaseStringCritical(JNIEnv *env, jstring string, const jchar *carray)
void GetStringRegion(JNIEnv *env, jstring str, jsize start, jsize len, jcahr *buf)
把String的内容复制出来,复制给Unicode编码格式的参数buf (*env)->SetStringRegion
void GetStringUTFRegion()(JNIEnv *env, jstring str, jsize start, jsize len, jcahr *buf)
GetStringUTFRegion有两个主要的参数,start 和 length, 这两个参数以Unicode编码计算. 该函数会做边界检查,所以可能抛出StringIndexOutOfBoundsException。
Java_com_conowen_test_testActivity_test(JNIEnv *env, jobject obj, jstring str) { char outputbuf[128], inputbuf[128]; int len = (*env)->GetStringLength(env, str); (*env)->GetStringUTFRegion(env, str, 0, len, outbuf); printf("%s", outputbuf); scanf("%s", inputbuf); return (*env)->NewStringUTF(env, inbuf); }
void Get<type>ArrayRegion(JNIEnv *env, <ArrayType>array, jsize start, jsize len, <nativeType> *buf)
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; } JNI中数组的基类为jarray,其他如jintArray都是继承自jarray。
使用<NativeType> *Get<Type>ArrayElements(JNIEnv *env,<ArrayType> array, jboolean *isCopy);进行数组操作
Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr) { jint *carr; jint i, sum = 0; carr = (*env)->GetIntArrayElements(env, arr, NULL); if (carr == NULL) { return 0; /* exception occurred */ } for (i=0; i<10; i++) { sum += carr[i]; } (*env)->ReleaseIntArrayElements(env, arr, carr, 0); return sum; }