Я изначально использовал функцию для возврата char * в java как строку UTF-8, но поскольку я продолжал получать ошибки, я написал следующую функцию, чтобы вернуть 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: отрицательный 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;
}