我最初使用一个函数将char*作为UTF-8字符串返回给Java,但是由于一直出现错误,因此我编写了以下函数,将char*
作为Javabyte[]
返回,这样我就可以在Java端尝试将数组转换为字符串:
jbyteArray Java_com_vektor_amapper_util_InputDeviceManager_getDevNameBytes(JNIEnv* env, jobject thiz, jint index) {
if(pDevs[index].device_name == NULL) return NULL;
int n=0;
while(pDevs[index].device_name){
n++;
} if (n==0) return NULL;
jbyteArray arr = (*env)->NewByteArray(env, n);
(*env)->SetByteArrayRegion(env,arr,0,n, (jbyte*)pDevs[index].device_name);
return arr;
}
但是当我调用它时,我的应用程序会崩溃。我是否漏掉了什么?
更新:条件缺少了++,导致无限循环。但是现在使用以下代码:
jbyteArray Java_com_vektor_amapper_util_InputDeviceManager_getDevNameBytes(JNIEnv* env, jobject thiz, jint index) {
int n=0;
if(pDevs[index].device_name == NULL) return NULL;
while(pDevs[index].device_name++){
n++;
} if(n==0) return NULL;
jbyteArray arr = (*env)->NewByteArray(env, n);
(*env)->SetByteArrayRegion(env,arr,0,n, (jbyte*)pDevs[index].device_name);
return arr;
}
我收到了这个奇怪的JNI警告:
06-15 22:40:02.303: W/dalvikvm(7616): JNI WARNING: negative jsize (NewByteArray)
既然我只增加了n
的值,那么它怎么可能发生呢?
更新2:以下代码可行:
jbyteArray Java_com_vektor_amapper_util_InputDeviceManager_getDevNameBytes(
JNIEnv* env, jobject thiz, jint index) {
if(pDevs[index].device_name == NULL) return NULL;
int n=0;
char* p = pDevs[index].device_name;
while(*p++){
n++;
} if(n<=0) return NULL;
jbyteArray arr = (*env)->NewByteArray(env, n);
(*env)->SetByteArrayRegion(env,arr,0,n, (jbyte*)pDevs[index].device_name);
return arr;
}
int n=0; while(pDevs[index].device_name){ n++; }
已经达到了它的终止条件。 - alkint n = strlen(pDevs[index].device_name)
? - Larphoid