java—从jni getbytearrayelements调用中提取字符串

cgyqldqp  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(667)

为了避免将byte[]转换为string的开销,我将byte[]从java传递到本机调用。我使用getbytearrayelements访问jbyte指针并将其转换为(char*)。有时,我看到一些非ascii字符打印使用这种方法。
经过研究,我了解到如果java byte[]不是以null结尾的,可能会发生这种情况。
问题-
处理字节[]时,从jni中提取字符的最佳方法是什么?
在java方面,如果我转换byte[]->string->byte[],会在末尾添加一个空字符吗?

py49o6xq

py49o6xq1#

当您从字符串创建字节数组时,您持有一些内存。您可以直接传递字符串并节省内存。
将字符串(c++中的jstring)转换为char*的正确方法是:

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 chargetstringutfchars(jnienvenv,jstring string,jboolean*iscopy);
返回一个指针,该指针指向一个字节数组,该数组表示采用修改的utf-8编码的字符串。此数组在被releasestringutfchars()释放之前是有效的。如果iscopy不为空,那么如果复制,*iscopy设置为jni\u true;如果没有复制,则设置为jni\ U false。

挑剔的本地人

在处理基元类型时,可以使用快速关键的本机函数来减少java转换的开销。详情请看这篇文章。

相关问题