jni和java对应关系
Java 类型 | 本地类型 | 描述 |
boolean | jboolean | C/C++8位整型 |
byte | jbyte | C/C++带符号的8位整型 |
char | jchar | C/C++无符号的16位整型 |
short | jshort | C/C++带符号的16位整型 |
int | jint | C/C++带符号的32位整型 |
long | jlong | C/C++带符号的64位整型e |
float | jfloat | C/C++32位浮点型 |
double | jdouble | C/C++64位浮点型 |
Object | jobject | 任何Java对象,或者没有对应java类型的对象 |
Class | jclass | Class对象 |
String | jstring | 字符串对象 |
Object[] | jobjectArray | 任何对象的数组 |
boolean[] | jbooleanArray | 布尔型数组 |
byte[] | jbyteArray | 比特型数组 |
char[] | jcharArray | 字符型数组 |
short[] | jshortArray | 短整型数组 |
int[] | jintArray | 整型数组 |
long[] | jlongArray | 长整型数组 |
float[] | jfloatArray | 浮点型数组 |
double[] | jdoubleArray | 双浮点型数组 |
函数 | Java 数组类型 | 本地类型 |
GetBooleanArrayElements | jbooleanArray | jboolean |
GetByteArrayElements | jbyteArray | jbyte |
GetCharArrayElements | jcharArray | jchar |
GetShortArrayElements | jshortArray | jshort |
GetIntArrayElements | jintArray | jint |
GetLongArrayElements | jlongArray | jlong |
GetFloatArrayElements | jfloatArray | jfloat |
GetDoubleArrayElements | jdoubleArray | jdouble |
jfloatArray jArray = env->NewFloatArray(8);
函数 | 描述 |
GetFieldID | 得到一个实例的域的ID |
GetStaticFieldID | 得到一个静态的域的ID |
GetMethodID | 得到一个实例的方法的ID |
GetStaticMethodID | 得到一个静态方法的ID |
定义字符串:
jobjectArray arrays = 0;
//定义长度
jsize len = 20;
arrays = (*jniEnv)->NewObjectArray(jniEnv, len, (*jniEnv)->FindClass(
jniEnv, "java/lang/String"), 0);
jstring jstr;
char* sa[] = { "Hello,", "world!", "JNI", "很", "好玩" };
int i = 0;
for (; i < len; i++)
{
jstr = (*env)->NewStringUTF(env, sa[i]);
(*env)->SetObjectArrayElement(env, arrays, i, jstr);//必须放入jstring
}
获取数组的值:
int k = 0;
for (; k < len; k++) {
jstring string = (jstring)((*jniEnv)->GetObjectArrayElement(jniEnv,
arrays, k));
if (string != NULL) {
char * c = (*jniEnv)->GetStringUTFChars(jniEnv, string, 0);
__android_log_print(ANDROID_LOG_INFO, "JNIMsg", c);
}
}
中间层数据类型转化:
char* ---> jstring (*jniEnv)->NewStringUTF(jniEnv,char*)
jstring ---> char (*jniEnv)->GetStringUTFChars(jniEnv, jstring, 0);
long ---> char* ltoa(long,char*,10); sprintf(csendBodyLen,"%ld",sendBodyLen);
char* ---> long *long = atol(char*);