JNI返回Java对象,可以返回本地参考,还是必须是全局
JNI returning Java object, is it OK to return local reference, or must it be global?
在jni方法中说我要返回java字符串(或任何其他Java对象(。返回的对象是该方法中创建的本地参考,还是应转换返回值全球参考?
琐碎的示例:
extern "C"
JNIEXPORT jstring JNICALL Java_some_package_SomeObj_getStringTest(JNIEnv *env, jclass obj)
{
return env->NewString("Test", 4); // OK to return local reference?
}
或应该是:
extern "C"
JNIEXPORT jstring JNICALL Java_some_package_SomeObj_getStringTest(JNIEnv *env, jclass obj)
{
jstring str = env->NewString("Test", 4);
return env->NewGlobalRef(str); // Must return a global reference?
}
来自JNI文档
全球和本地参考
JNI将本机代码使用的对象引用分为两个类别: local 和全局参考。本地参考对于本机方法调用的持续时间有效,并且在本机方法返回后自动释放。全球参考文献在明确释放之前一直有效。
对象作为本地参考传递给本机方法。 JNI函数返回的所有Java对象都是本地参考。JNI允许程序员从本地参考创建全局引用。期望Java对象的JNI功能同时接受全局和局部参考。本机方法可以返回本地或全局引用VM的结果。
所以,您的第一个示例完全很好且合法:
extern "C"
JNIEXPORT jstring JNICALL Java_some_package_SomeObj_getStringTest(JNIEnv *env, jclass obj)
{
return env->NewString("Test", 4); // OK to return local reference?
}
前者,我已经做到了。按预期工作。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- C ++程序如何返回我的数组或写入全局变量
- JNI返回Java对象,可以返回本地参考,还是必须是全局
- 从全局 CUDA 函数返回数据
- 存储在全局变量中的函数指针在进入函数时设置为 0,并在退出函数时返回到以前的状态
- C++ 全局挂钩.为什么 SetWindowsHookEx 返回 NULL
- 从函数返回指向全局数组的指针
- 对全局运算符new返回的指针使用realloc
- c#中如何从带有全局变量的c++ dll函数中获取返回数组
- 具有自定义返回类型的全局命名空间中的友元函数
- PyEval_GetLocals返回全局变量