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

    }
}

库加载没有问题,第一个方法被调用,但不是第二个。

如果我将 bMethod 从 B 移动到 A,一切正常。

将 System.loadlibrary() 从 B 移动到 A 似乎没有效果。

是否可以使用其他本地方法扩展 A 类?

4

1 回答 1

3

Ok, I just found the solution. The problem was in the .cpp file:

I edited the MyNativeLibraryWithBothaMethodAndbMethod file:

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

with

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

Note the "B" in the second signature.

于 2013-04-17T10:00:10.377 回答