首页 > 解决方案 > 如何在 env->GetStringUTFChars(...) 之后使用 env->ReleaseStringUTFChars(...)

问题描述

我正在学习在 Android 中使用 C++。

以下函数运行良好,但我不知道如何使用ReleaseStringUTFChars(fileName, 0)来释放(或释放)由env->GetStringUTFChars(input, 0);

Activity_stringFromJNI(
        JNIEnv *env,
        jobject, /* this */
        jstring input) {
    const char *str_C = env->GetStringUTFChars(input, 0);
    char *data = funcX(str_C); // funcX allocates with malloc

    // env->ReleaseStringUTFChars(input, str_C); ???

    free(data); // Freeing funcX allocations
    return env->NewStringUTF(someString.c_str());
}

另外,我一直在尝试查看文档,但找不到。如何检查内存是否被正确释放或释放?谢谢!

标签: javac++java-native-interface

解决方案


根据JNI 文档(可在 Oracle 网站上获得,Java 的所有者),您只需传递给ReleaseStringUTFChars()原始文档jstring和返回的const char *指针GetStringUTFChars(),例如:

Activity_stringFromJNI(
        JNIEnv *env,
        jobject, /* this */
        jstring input)
{
    const char *str_C = env->GetStringUTFChars(input, 0);
    char *data = funcX(str_C); // funcX allocates with malloc
    env->ReleaseStringUTFChars(input, str_C);

    // ... data is being used ...
    // ... data is being used ...

    free(data); // Freeing funcX allocations
    return env->NewStringUTF(someString.c_str());
}

在旁注中,请注意 JNI 处理Modified UTF-8,而不是标准UTF-8。但大多数处理 UTF-8 的 C++ 代码很可能处理标准UTF-8,而不是修改后的 UTF-8。GetStringChars()因此,如果您能提供帮助( 、ReleaseStringChars()NewString()等),通常最好以原生 UTF-16 编码而不是 UTF-8 来处理 Java 字符串。


推荐阅读