2

我正在使用 JNI 调用 API 编写一些代码。AC 程序启动一个 JVM 并调用它。JNIenv 指针对于 C 文件是全局的。我有许多 C 函数需要对给定的作业类执行相同的操作。所以我编写了辅助函数,它接受一个作业并处理它,返回所需的数据(C 数据类型......例如,一个 int 状态值)。编写 C 辅助函数并将作业对象作为参数传递给它们是否安全?

即(一个简单的例子 - 旨在说明问题):

int getStatusValue(jobject jStatus)
{
  return (*jenv)->CallIntMethod(jenv,jStatus,statusMethod);
}

int function1()
{
  int status;
  jobject aObj = (*jenv)->NewObject
    (jenv,
     aDefinedClass,
     aDefinedCtor);

  jobject j = (*jenv)->CallObjectMethod
    (jenv,
     aObj,
     aDefinedObjGetMethod)

  status = getStatusValue(j);

  (*jenv)->DeleteLocalRef(jenv,aObj);
  (*jenv)->DeleteLocalRef(jenv,j);

  return status;

} 

谢谢。

4

2 回答 2

0

我不熟悉 JNI 的详细信息,但我注意到的是:

return (*jenv)->CallIntMethod(jenv,jStatus,statusMethod);

这看起来像官方的 JNI 代码,它以 ajobect作为参数。如果它适用于 JNI,那么它没有理由不适用于您的代码。

于 2010-04-29T06:06:16.310 回答
0

在本机方法返回之前,所有 jni 对象都是有效的。只要您不在两个 jni 调用之间存储非全局 jni 对象,一切都应该工作。
jni 函数的调用应该像这样工作:

  1. Java函数调用
  2. 创建本地本地引用
  3. 调用本机函数
  4. 做你的事
  5. 退出本机功能
  6. 释放现有的本地参考
  7. 返回java

第 4 步可以包含任何代码,如果之前没有发布,本地引用在第 6 步之前保持有效。
如果您想在两次调用本地 java 函数之间将 jni 对象存储在 c 端,您必须创建全局引用并稍后释放它们。不释放全局引用会导致内存泄漏,因为垃圾收集器无法释放相关的 java 对象。

于 2010-04-29T06:25:20.843 回答