java - JNI Android - 将 char* 转换为字节数组并将其返回给 java

标签 java android c android-ndk

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

相关文章:

java - 使用 JavaPoet 生成枚举

java - 文件路径中的特殊字符导致 XML XSD 验证失败

android - 如何处理构建 API 版本 > minSdkVersion?

android - 如何从设备中删除 ldpi 支持?

c - Light C 数据结构和字符串库?

java - Python 有类似 Java 的 System.arraycopy 的东西吗?

java - 字符串合并排序出现空指针异常?

android - 由于短信许可,谷歌游戏商店拒绝了我的应用程序

c - 动态数据结构

c - 如何从函数 void zamiana Wierszy(...) 返回主函数?