簡體   English   中英

Android-將JNI NewObject()傳遞給Java時不保存值

[英]Android - JNI NewObject() does not save values when passing it to Java

我正在使用本機代碼創建對象,然后將其作為參數傳遞給我調用的方法。 在本機代碼中似乎沒什么問題,但是當我用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時,為什么呢?

您沒有將構造的對象傳遞給方法(或實際上對它執行任何操作)。

代替

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

你不想要

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

另外,您不檢查該呼叫是否成功。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM