JNI Android - 将char*转换为byte数组并返回给Java

13

我最初使用一个函数将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;
}

2
如果看起来像是无限循环,那么这段代码int n=0; while(pDevs[index].device_name){ n++; }已经达到了它的终止条件。 - alk
@alk 你是对的,我忘记在while条件中加上++了,但代码还不能工作。我放上了更新后的代码。 - Vektor88
Android NDK发行版中的hello-jni示例向您展示如何返回UTF字符串。 - Chris Stratton
@ChrisStratton 是的,我能够创建字符串,但有时会出现错误,所以我更喜欢在Java端将字节数组转换为字符串。使用这种新方法仍然没有错误。 - Vektor88
你不能简单地这样做吗:int n = strlen(pDevs[index].device_name) - Larphoid
1个回答

9
这应该是这样吗?
char* p = pDevs[index].device_name;
while( *p++) {
...
}

3
你说得对,每次我重新开始用C编程时,我都会忘记所有的基础知识。 - Vektor88

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接