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,爲什麼?
aww不敢相信我錯過了。謝謝 – KaiserJohaan