2

Android でネイティブ メソッドをオーバーライドできないことをここここで見てきましたが、いくつかのネイティブ メソッドを宣言するクラスを作成し、それをいくつかの追加のネイティブ メソッドを宣言する別のクラスで拡張できるかどうか疑問に思っていました。

私の状況は次のとおりです。

public class A{
    public native int aMethod();
}

public class B extends A{
    public native int bMethod();

    static {
        try{
            System.loadLibrary("MyNativeLibraryWithBothaMethodAndbMethod");
        }
        catch (java.lang.UnsatisfiedLinkError e){
            System.out.println (e);
        }
    }
}

public class MyActivity extends Activity {
    private B bClass;

    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        bClass = new B();
        bClass.aMethod();//Working fine
        bClass.bMethod();//UnsatisfiedLinkError

    }
}

ライブラリは問題なくロードされ、最初のメソッドは呼び出されますが、2 番目のメソッドは呼び出されません。

bMethod を B から A に移動すると、すべて正常に動作します。

System.loadlibrary() を B から A に移動しても効果がないようです。

追加のネイティブ メソッドで A クラスを拡張することは可能ですか?

4

1 に答える 1

3

わかりました、解決策を見つけました。問題は .cpp ファイルにありました。

MyNativeLibraryWithBothaMethodAndbMethodファイルを編集しました:

#include "my_package_name_A.h"
JNIEXPORT jint JNICALL Java_my_package_name_A_aMethod( ... ){ ... }
JNIEXPORT jint JNICALL Java_my_package_name_A_bMethod( ... ){ ... }

#include "my_package_name_A.h"
JNIEXPORT jint JNICALL Java_my_package_name_A_aMethod( ... ){ ... }
JNIEXPORT jint JNICALL Java_my_package_name_B_bMethod( ... ){ ... }

2 番目の署名の「 B 」に注意してください。

于 2013-04-17T10:00:10.377 に答える