Android - JNI NewObject () не сохраняет значения при передаче его в Java - PullRequest
1 голос
/ 12 октября 2011

Я использую нативный код для создания объекта, который затем передаю в качестве аргумента методу, который я вызываю. В нативном коде, похоже, ничего не происходит, но когда я получаю вызов в 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, тогда он может быть сборщиком мусора. Однако его поля данных - которые задаются в конструкторе - просто равны нулю, когда я его вызываю. Почему?

1 Ответ

0 голосов
/ 12 октября 2011

Вы не передаете объект, который вы построили, методу (или действительно что-то делаете с ним).

Вместо

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

вам не нужно

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

?

Также вы не проверяете, был ли этот вызов успешным или нет.

...