java - 如何在 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());
}
另外,我一直在尝试查看文档,但找不到。如何检查内存是否被正确释放或释放?谢谢!
解决方案
根据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 字符串。
推荐阅读
- dpdk - L2FWD dpdk 申请结果
- typescript - 为什么需要对通用定义的返回类型进行强制转换?
- jsp - OpenCMS 10 开放图元
- javascript - 在 javascript 中,我如何知道 html 对象属性是属性、方法还是事件?
- python - 使用 tensorflow.map_fn 创建自定义层时出现 TypeError
- javascript - 使用map函数创建对象,currentValue作为对象键
- python - 不带双括号的数组索引输出
- android - Android:Twitter sdk:无法导入任何 twitter 类
- angular - 字体真棒图标不显示角度6
- ansible - 基于 vars_prompt 的剧本的条件输入 - Ansible