android扩展类使用本机方法

时间:2013-04-17 09:45:04

标签: android inheritance native extends

我见过herehere你不能覆盖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类?

1 个答案:

答案 0 :(得分: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( ... ){ ... }

请注意第二个签名中的“ B ”。