JNI Android-将char *转换为字节数组并将其返回给Java [英] JNI Android - Converting char* to byte array and return it to java

查看:465
本文介绍了JNI Android-将char *转换为字节数组并将其返回给Java的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最初使用一个函数以UTF-8字符串的形式将char *返回给Java,但是由于不断出错,我编写了以下函数以Java的形式返回char*作为Java byte[],这样我就可以尝试将数组转换为Java端的String:

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?

更新:该条件缺少++,这导致了无限循环.但是现在有了以下代码:

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

我收到这个奇怪的JNI警告:

I get this weird JNI warning:

06-15 22:40:02.303:W/dalvikvm(7616):JNI警告:负jsize(NewByteArray)

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

怎么可能,因为我只增加了n的值?

How can it be since I am only increasing the value of 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++) {
...
}

这篇关于JNI Android-将char *转换为字节数组并将其返回给Java的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆