我见过here和here你不能覆盖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类?
答案 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 ”。