我最初使用一个函数将 char* 作为 UTF-8 字符串返回给 java,但由于我不断出错,我编写了以下函数将 char*
作为 Java 返回>byte[]
,这样我就可以尝试在 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;
}
最佳答案
不应该是这样吗?
char* p = pDevs[index].device_name;
while( *p++) {
...
}
关于java - JNI Android - 将 char* 转换为字节数组并将其返回给 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17124712/