1

アプリケーションを実行しようとしていますが、ネイティブ関数を呼び出すとエラーが発生し、プログラムがクラッシュします。JavaまたはCで何かに名前を付ける方法と関係があると確信しています。

これがJavaの関数への私の呼び出しです:

package my.commander;

public class RelayAPIModel {

    public static class NativeCalls {

        static {
            System.loadLibrary( "RelayAPI");
        }

        public native static byte InitRelayJava();

        public native static void FreeRelayJava();
    }

.cファイル内の関数は次のとおりです。

void Java_my_commander_RelayAPIModel_FreeRelayJava( JNIEnv * env, jobject this ) {
    RelayAPI_DataValid = 0;
    RelayAPI_SetBaud = 0;
    RelayAPI_get = 0;
    RelayAPI_put = 0;
    RelayAPI_flush = 0;
    RelayAPI_delay = 0;
    RelayAPI_initilized = 0;
}


BYTE Java_my_commander_RelayAPIModel_InitRelayJava( JNIEnv *env, jobject obj  ) {
    ...
    ...
}

ここにそれらは.hファイルにあります:

void Java_my_commander_RelayAPIModel_FreeRelayJava( JNIEnv * env, jobject obj );

BYTE Java_my_commander_RelayAPIModel_InitRelayJava( JNIEnv *env, jobject obj );

これが私のLogCat:

08-01 09:58:21.933: E/AndroidRuntime(17170): FATAL EXCEPTION: main
08-01 09:58:21.933: E/AndroidRuntime(17170): java.lang.UnsatisfiedLinkError: InitRelayJava
08-01 09:58:21.933: E/AndroidRuntime(17170):    at my.eti.commander.RelayAPIModel$NativeCalls.InitRelayJava(Native Method)
08-01 09:58:21.933: E/AndroidRuntime(17170):    at my.eti.commander.MainMenu.initMain(MainMenu.java:241)
08-01 09:58:21.933: E/AndroidRuntime(17170):    at my.eti.commander.MainMenu.onCreate(MainMenu.java:81)
08-01 09:58:21.933: E/AndroidRuntime(17170):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-01 09:58:21.933: E/AndroidRuntime(17170):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-01 09:58:21.933: E/AndroidRuntime(17170):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-01 09:58:21.933: E/AndroidRuntime(17170):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-01 09:58:21.933: E/AndroidRuntime(17170):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08-01 09:58:21.933: E/AndroidRuntime(17170):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-01 09:58:21.933: E/AndroidRuntime(17170):    at android.os.Looper.loop(Looper.java:130)
08-01 09:58:21.933: E/AndroidRuntime(17170):    at android.app.ActivityThread.main(ActivityThread.java:3683)
08-01 09:58:21.933: E/AndroidRuntime(17170):    at java.lang.reflect.Method.invokeNative(Native Method)
08-01 09:58:21.933: E/AndroidRuntime(17170):    at java.lang.reflect.Method.invoke(Method.java:507)
08-01 09:58:21.933: E/AndroidRuntime(17170):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-01 09:58:21.933: E/AndroidRuntime(17170):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-01 09:58:21.933: E/AndroidRuntime(17170):    at dalvik.system.NativeStart.main(Native Method)

Java_my_commander_RelayAPIModel_NativeCalls_FreeRelayJavaここで、Cメソッド名をとに変更してみたことを明確にしておきますJava_my_commander_RelayAPIModel_NativeCalls_InitRelayJava。アプリケーションはまだ起動に失敗し、これはそのためのLogCatでした。

08-01 11:22:10.735: E/AndroidRuntime(17441): FATAL EXCEPTION: main
08-01 11:22:10.735: E/AndroidRuntime(17441): java.lang.UnsatisfiedLinkError: InitRelayJava
08-01 11:22:10.735: E/AndroidRuntime(17441):    at my.eti.commander.RelayAPIModel$NativeCalls.InitRelayJava(Native Method)
08-01 11:22:10.735: E/AndroidRuntime(17441):    at my.eti.commander.MainMenu.initMain(MainMenu.java:241)
08-01 11:22:10.735: E/AndroidRuntime(17441):    at my.eti.commander.MainMenu.onCreate(MainMenu.java:81)
08-01 11:22:10.735: E/AndroidRuntime(17441):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-01 11:22:10.735: E/AndroidRuntime(17441):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-01 11:22:10.735: E/AndroidRuntime(17441):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-01 11:22:10.735: E/AndroidRuntime(17441):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-01 11:22:10.735: E/AndroidRuntime(17441):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08-01 11:22:10.735: E/AndroidRuntime(17441):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-01 11:22:10.735: E/AndroidRuntime(17441):    at android.os.Looper.loop(Looper.java:130)
08-01 11:22:10.735: E/AndroidRuntime(17441):    at android.app.ActivityThread.main(ActivityThread.java:3683)
08-01 11:22:10.735: E/AndroidRuntime(17441):    at java.lang.reflect.Method.invokeNative(Native Method)
08-01 11:22:10.735: E/AndroidRuntime(17441):    at java.lang.reflect.Method.invoke(Method.java:507)
08-01 11:22:10.735: E/AndroidRuntime(17441):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-01 11:22:10.735: E/AndroidRuntime(17441):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-01 11:22:10.735: E/AndroidRuntime(17441):    at dalvik.system.NativeStart.main(Native Method)


さて、エラーは上記のコードにあると思います。問題が他にある場合に備えて、ここにさらに情報を追加します。

私が作成しているこのアプリケーションは、上記の関数を使用して、しばらく使用されているライブラリを呼び出します。このライブラリは、以前はPalmのBluetooth機能を利用するPalmPilotプログラムの関数を呼び出すために使用されていました。AndroidデバイスにはさまざまなBluetoothライブラリ/機能があるため、ネイティブライブラリにコードを追加して、JavaコードにBACKを呼び出し、AndroidデバイスのBluetooth機能にアクセスします。これに関連するすべてのコードをここに投稿したくはありませんが、誰かが投稿する必要があると感じた場合は投稿します。

4

2 に答える 2

6

エラーメッセージには、次の場所にあることが示されています。

my.eti.commander.RelayAPIModel$NativeCalls.InitRelayJava (Native Method)

したがって、次のことを確認してください。

  • nativeメソッド宣言は実際にはクラス内にあり、ネストされたクラスRelayAPIModelを含まないものではありません。RelayAPIModel.NativeCalls
  • Java側のパッケージ名my.commandermy.eti.commander

編集:またはC側で修正できます。ネストされたクラスにネイティブメソッドを作成する場合、その適切な名前は次のようになります。

Java_my_commander_RelayAPIModel_00024NativeCalls_InitRelayJava()

00024は、Java内部のネストされたクラス区切り文字である$文字のコードです。また、2番目のパラメータ()の意味は異なります-のポインタ/クラスポインタjobject Objの代わりに、のポインタになります。のメソッドを解決/呼び出すために使用することはできません。thisRelayAPIModelRelayAPIModel.NativeCallsRelayAPIModel

于 2012-08-01T15:53:00.587 に答える
5

javahを使用して、正しい名前のネイティブファイルを含む.hファイルを生成できます。

javah -jni -classpath bin/classes com.example.app.MyClass
于 2012-08-01T15:39:15.213 に答える