【问题标题】:Android - JNI NewObject() does not save values when passing it to JavaAndroid - JNI NewObject() 在将值传递给 Java 时不保存值
【发布时间】:2011-10-12 12:34:49
【问题描述】:

我正在使用本机代码创建一个对象,然后将其作为参数传递给我调用的方法。 本机代码似乎没有任何问题,但是当我在 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,为什么?

【问题讨论】:

    标签: android c++ java-native-interface android-ndk


    【解决方案1】:

    你没有将你构造的对象传递给方法(或者实际上用它做任何事情)。

    代替

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

    你不想

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

    ?

    你也没有检查调用是否成功。

    【讨论】:

    • aww 不敢相信我错过了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    相关资源
    最近更新 更多