2

この非常に重要な詳細が、インターネット上で包括的なウォークスルーを欠いていることに驚いています。または多分私は最悪のグーグルです。または、まったくばかげたプログラマー。

私は何ヶ月もアンドロイドに取り組んできましたが、最近 JNI をするように言われました。俺のCスキルはもう錆びている。しかし、これに固執して先に進むことができなかったとき、私は追いついていました。

シンプルなものが欲しい。MainActivity でのネイティブ メソッドの宣言は次のとおりです。

パブリック ネイティブ オブジェクト createObject();

これが私がそれを使用する方法です

    Object abc = createObject();
    Integer num = (Integer) abc;

C から java.lang.Integer オブジェクトを作成し、それを Java に送信したいだけです。これ以上簡単なことはありません

    jobject Java_com_example_hellojni_HelloJni_callbackJava(JNIEnv * env, jobject this )
{
    jclass cls = (*env)->FindClass(env, "java/lang/Integer");
    jmethodID methodID = (*env)->GetMethodID(env, cls, "<init>", "(I)V");
    jint number = 8 ; 
    return (*env)->NewObject(cls, methodID, number);

}

(android ndk r8c) スタック トレースが表示され、アプリケーションがクラッシュします。

12-14 16:10:07.595: D/dalvikvm(302): Trying to load lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x45f3da60
12-14 16:10:07.625: D/dalvikvm(302): Added shared lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x45f3da60
12-14 16:10:07.625: D/dalvikvm(302): No JNI_OnLoad found in /data/data/com.example.hellojni/lib/libhello-jni.so 0x45f3da60, skipping init

12-14 16:10:07.684: W/dalvikvm(302): **JNI WARNING: threadid=1 using env from threadid=0**
12-14 16:10:07.684: W/dalvikvm(302):              in Lcom/example/hellojni/HelloJni;.callbackJava ()V (NewObject)
12-14 16:10:07.684: I/dalvikvm(302): "main" prio=5 tid=1 NATIVE
12-14 16:10:07.684: I/dalvikvm(302):   | group="main" sCount=0 dsCount=0 s=N obj=0x4001d8e0 self=0xccb0
12-14 16:10:07.684: I/dalvikvm(302):   | sysTid=302 nice=0 sched=0/0 cgrp=default handle=-1345026008
12-14 16:10:07.684: I/dalvikvm(302):   | schedstat=( 152515888 582639885 48 )
12-14 16:10:07.684: I/dalvikvm(302):   at com.example.hellojni.HelloJni.callbackJava(Native Method)
12-14 16:10:07.695: I/dalvikvm(302):   at com.example.hellojni.HelloJni.onCreate(HelloJni.java:59)
12-14 16:10:07.695: I/dalvikvm(302):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-14 16:10:07.695: I/dalvikvm(302):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
12-14 16:10:07.695: I/dalvikvm(302):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
12-14 16:10:07.695: I/dalvikvm(302):   at android.app.ActivityThread.access$2300(ActivityThread.java:125)
12-14 16:10:07.695: I/dalvikvm(302):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
12-14 16:10:07.695: I/dalvikvm(302):   at android.os.Handler.dispatchMessage(Handler.java:99)
12-14 16:10:07.695: I/dalvikvm(302):   at android.os.Looper.loop(Looper.java:123)
12-14 16:10:07.695: I/dalvikvm(302):   at android.app.ActivityThread.main(ActivityThread.java:4627)
12-14 16:10:07.695: I/dalvikvm(302):   at java.lang.reflect.Method.invokeNative(Native Method)
12-14 16:10:07.695: I/dalvikvm(302):   at java.lang.reflect.Method.invoke(Method.java:521)
12-14 16:10:07.695: I/dalvikvm(302):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-14 16:10:07.695: I/dalvikvm(302):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-14 16:10:07.695: I/dalvikvm(302):   at dalvik.system.NativeStart.main(Native Method)
12-14 16:10:07.704: E/dalvikvm(302): VM aborting

私を助けてください 。

ありがとう

4

1 に答える 1

9

私は些細な間違いをしていましたが、JNI をさらに検索して調査した結果、

NewObject の引数に env を入れ忘れました。誰かがそれを必要とする場合に備えて、これが正しいコードです

jobject Java_com_example_hellojni_HelloJni_createObject(JNIEnv * env, jobject this )
{

    jclass cls = (*env)->FindClass(env, "java/lang/Integer");
    jmethodID methodID = (*env)->GetMethodID(env, cls, "<init>", "(I)V");
    jobject a=(*env)->NewObject(env,cls, methodID, 5);
    return a;
}
于 2012-12-14T12:53:20.400 に答える