JNI Android – Converting char* to byte array and return it to java

I initially used a function to return a char* to java as UTF-8 string, but since I kept getting errors, I wrote the following function to return a char* as a Java byte[], so that I could try to convert the array into a String in java side:

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;
}

But when I call it my application crashes. Am I missing something?

  • Can an android.hardware.camera2.CaptureRequest be used with OpenCV?
  • Logout from Fabric Plugin
  • Title, etc. not showing in Android Toolbar
  • Android Garbage Collector Freed Memory
  • Signing an existing apk using debug.keystore generated by eclipse
  • Android: How to repeat a service with AlarmManager every 15 minutes, but only run from 8:00AM to 18:00PM?
  • Update: The condition was missing a ++ and this caused an infinite loop. But now with the following code:

    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;
    }
    

    I get this weird JNI warning:

    06-15 22:40:02.303: W/dalvikvm(7616): JNI WARNING: negative jsize (NewByteArray)

    How can it be since I am only increasing the value of n?

    Update 2: the following code works:

    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;
    }
    

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.