从JNI GetByteArrayElements调用中提取字符串

时间:2017-01-03 18:58:05

标签: java java-native-interface

为了避免将byte []转换为String的开销,我将byte []从Java传递给本机调用。我使用GetByteArrayElements来访问jbyte指针并将其转换为(char *)。有时,我看到使用这种方法打印的一些非ASCII字符。

在研究了这个之后,我明白如果java byte []没有以null结尾,就会发生这种情况。

问题 -

  1. 在交易时从JNI中提取字符的最佳方法是什么 用字节[]?

  2. 在java方面,如果我转换byte [] - >字符串 - > byte [],会在末尾添加一个空字符吗?

1 个答案:

答案 0 :(得分:1)

当你从字符串创建字节数组时,你会保留一些内存。您可以直接传递字符串并节省内存。

将String(C ++中的jstring)转换为char *的

Proper way是:

JNIEXPORT jstring JNICALL Java_your_package_structure_className_myMethod(JNIEnv* env, jobject jobj, jstring str) {

    char* native_string = env->GetStringUTFChars(env, str, JNI_FALSE);

    const char* hello = "hello ";
    char* hello_prefix = new char[6 + strlen(native_string)];
    strcpy(hello_prefix, hello);
    strcat(hello_prefix, native_string);
    /*
    call
    env->ReleaseStringUTFChars(env, str, native_string);
    if env->GetStringUTFChars(env, str, JNI_TRUE) was executed
    */

    jstring result = env->NewStringUTF(env, hello_prefix);
    delete[] hello_prefix;

    return result;
}
  

const char * GetStringUTFChars(JNIEnv * env,jstring string,   jboolean * isCopy);

     

返回一个指向字节数组的指针,该字节数组表示修改后的UTF-8编码中的字符串。此数组在ReleaseStringUTFChars()释放之前有效。   如果isCopy不为NULL,则如果进行了复制,则* isCopy设置为JNI_TRUE;如果没有复制,则设置为JNI_FALSE。

重要的当地人

在使用基本类型时,可以使用快速关键本机函数来减少Java转换的开销。有关详细信息,请查看this post