2011-10-12 31 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