Подтвердить что ты не робот

JNI Android - преобразование char * в массив байтов и возврат его в java

Я изначально использовал функцию для возврата 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;
}
4b9b3361

Ответ 1

Разве это не должно быть?

char* p = pDevs[index].device_name;
while( *p++) {
...
}