1

jni への Java コード呼び出しを行うことはできますが、jni から Java への呼び出しで問題が発生します。以下のコードと結果を参照してください。

Java では:

public class SocketClient {
private native void nativeInit();

public void Init()
{
    nativeInit();
}
.........
    public boolean IsConnected()
    {
        Log.i("Test", "Hien public boolean IsConnected()");
        return _is_connected;
    }
.......

Init メソッドを呼び出します

SocketClient socketClient = new SocketClient();
socketClient.Init();

Jni で:

JNIEXPORT void Java_SocketClient_nativeInit (JNIEnv* env, jobject obj)
{
    LOG_INFO("Hien2 Java_SocketClient_nativeInit at jni layer");
    jclass cls = (*env)->GetObjectClass(env, obj);
    jmethodID mid = (*env)->GetMethodID(env, cls, "IsConnected", "()Z");
    int temp = (*env)->CallBooleanMethod(env, cls, mid);
    LOG_INFO("Hien3 temp=%d", temp);
}

結果出力は以下のとおりです。

Hien2 Java_SocketClient_nativeInit at jni layer
Hien3 temp=168

IsConnected() のコードは呼び出されません!!!

4

2 に答える 2

1

間違ったオブジェクトを呼び出しCallBooleanMethodています --- クラス オブジェクトにはメソッドがありませんIsConnected! そのはず:

(*env)->CallBooleanMethod(env, obj, mid);
于 2013-06-07T03:07:07.540 に答える
1

コードを少し修正する必要があります。

int temp = (*env)->CallBooleanMethod(env, obj, mid);

Java メソッド自体を呼び出す場合は、クラスではなくオブジェクトを呼び出す必要があります。関数定義を注意深く確認してください。

于 2013-06-07T03:08:59.143 に答える