2011-10-12 30 views
1

我使用本地代码创建一个对象,然后将其作为参数传递给我调用的方法。 在本地代码中没有出现任何错误,但是当我使用Java进行调用时,该对象似乎没有值。Android - JNI NewObject()在将值传递给Java时不保存值

下面是我在本地创建的java对象的代码:

package org.test; 
import java.util.ArrayList; 

public class JNITeam { 
    public int mTeamID; 
    public String mTeamName; 
    private ArrayList<String> mMembers; 

    public JNITeam(int id, String name) { 
     mTeamID = id; 
     mTeamName = name; 
    } 

    public void addMember(String name) { 
     mMembers.add(name); 
    } 

} 

下面是用于创建类的实例,并把它传递到Java方法“onGetTeam”,这需要一个本机代码上述类的实例作为参数。它是从本地代码中创建的线程运行的,因此我必须附加该线程。

JNIEnv* jenv = 0; 
      clientHandle->runningJVM->AttachCurrentThread(&jenv,0); 
      if (!jenv) 
       __android_log_print(ANDROID_LOG_INFO, ANDROID_DEBUG_TAG, "jenv is null"); 

      jclass cls = jenv->GetObjectClass(clientHandle->job); 
      if (!cls) 
       __android_log_print(ANDROID_LOG_INFO, ANDROID_DEBUG_TAG, "cls is null"); 

      jmethodID constructor = jenv->GetMethodID(clientHandle->JNITeamCls, "<init>", "(ILjava/lang/String;)V"); 

      jint teamID = 2; 
      jstring js = jenv->NewStringUTF("test"); 

      jobject dataObject = jenv->NewObject(clientHandle->JNITeamCls, constructor, teamID, js); 
      if (!dataObject) 
       __android_log_print(ANDROID_LOG_INFO, ANDROID_DEBUG_TAG, "dataobject is null"); 

      if (jenv && cls && dataObject) { 
       jmethodID mid = jenv->GetMethodID(cls,"onGetTeam","(Lorg/test/JNITeam;)V"); 
       if (mid) { 
        jenv->CallVoidMethod(clientHandle->job,mid); 
       } 
       else { 
        __android_log_print(ANDROID_LOG_INFO, ANDROID_DEBUG_TAG, "mid is null"); 
       } 
      } 

我不希望该对象是持久性的;我希望它在调用Java期间有效,然后它可以被垃圾收集。然而,当我调用它时,它的数据字段(在构造函数中设置)仅为null,为什么?

回答

0

您没有将您构建的对象传递给该方法(或者确实对其执行了任何操作)。

而不是

   jenv->CallVoidMethod(clientHandle->job,mid); 

没有你要

   jenv->CallVoidMethod(clientHandle->job,mid,dataObject); 

你还没有检查这个调用是否成功。

+0

aww不敢相信我错过了。谢谢 – KaiserJohaan