Android NDK使用不同的命名空间调用本机方法
我是JNI编程的新手我可以从不同的JNI命名空间定义中调用本机方法吗?
例如:
package com.example.hellojni; public class HelloJni extends Activity { public native int MyMethod(); public native int OtherMethod(); // this works have the namespace package=jniexport interface static {System.loadLibrary("hello-jni");} @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int b = OtherMethod(); //works int a = MyMethod(); //ERROR java.lang.reflect.InvocationTargetException } } ================File.c================ JNIEXPORT int JNICALL Java_Cardioline_HelloJni_MyMethod(JNIEnv *env, jobject thisObj) { return 1; } JNIEXPORT int JNICALL Java_com_example_hellojni_HelloJni_OtherMethod(JNIEnv *env, jobject thisObj) { return 2; }
不,JNI方法名称由javah预先确定。 尝试从这里开始:
http://blog.edwards-research.com/2012/04/tutorial-android-jni/
javah将为您提供标头,您必须将方法声明复制到.c文件中。
如果您要在另一个类中调用JNI方法,请在java中调用另一个类。 基本上改变这个:
int a = MyMethod();
对此:
int a = new CardioLine.HelloJni().MyMethod();
通常,我将Java文件一对一映射到.c / .cpp文件。 这可能也是你想要的(对于使用本机方法的Java类)。
正如@JonnyBoy在他的回答中解释的那样,JNI本机函数的名称与使用此函数作为本机方法的Java类的全名紧密耦合。 com.example.hellojni
包中的HelloJni
类的全名是com.example.hellojni.HelloJni,因此它查找名称以Java_com_example_hellojni_HelloJni_
开头的本机函数。
幸运的是,Android中没有要求所有类都在app包下 。 例如,您注册为com.example.hellojni
应用程序可以免费包含并使用CardioLine
包和CardioLine.HelloJni
类。
简单Android项目的目录结构将包含如下树:
src com example hellojni HelloJni.java CardioLine HelloJni.java
另一方面,如果在本机库中包含JNI_OnLoad()函数并使用RegisterNatives() ,则无论其导出的名称如何,Java类都可以具有本机方法。