2010-04-29 48 views
1

我使用JNI Invocation API编码了一些东西。一个C程序启动一个JVM并调用它。 JNIenv指针对于C文件是全局的。我有许多C函数需要对给定的工作类执行相同的操作。所以我编写了helper函数,它接受jobject并处理它,返回所需的数据(一个C数据类型,例如一个int状态值)。编写C帮助函数并将作业作为参数传递给它们是否安全?在JNI Invocation API中工作时安全地将对象传递给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; 

} 

感谢。

回答

0

我不和JNI的细节的人,但一旦件事我注意到的是:

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

看起来像官方JNI代码,它走的是一条jobect作为参数。如果它适用于JNI,那么没有理由不能为你的代码工作。

0

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

  1. Java函数调用
  2. 创建本地局部引用
  3. 调用本地函数
  4. 做你的东西
  5. 退出本地函数
  6. 释放现有的本地参考文献
  7. 返回到java

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

+0

我使用JNI调用API从C的逻辑流程是这样的: 0.启动了JVM中C. 1.从C调用到Java 2.手柄结果从Java返回。 3.发布本地参考。 4.关闭JVM。 步骤1-3可能会在JVM启动和关闭之间发生N次。我做了一些测试,看起来没问题。这些文档让我担心传递这些本地引用...... – bubbadoughball 2010-04-30 04:59:55

相关问题