古怪的JNI问题二
今天又差点被JNI搞的抓狂了,本来跑的好好的程序因为我加了JUnit后突然跑不通了。于是开始了郁闷的排错过程。经过了多次
的分析和调试,最后发现原来是Java的类名改变导致的。对于JNI通常我们是先定义一个Java类,然后根据类来生成JNI的C++头
文件,最后在Java中去load这个文件来调用函数。看一个例子,假设我们有一个类:
public class Person {
public native String sayHello();
}
那么生成的JNI C++头文件中的定义应该是:
JNIEXPORT jstring JNICALL Java_Person_sayHello (JNIEnv *, jobject);
请注意这个声明的格式,Java是固定的,Person是类名,sayHello是方法名。所以,当你改变了Java类名后,你应该同时改变你
C++的导出声明。想到这里,那么如果我们使用了指定的包来,如com.abc.Person。那么我们就应该使用如下的命令去创建声
明:javah com.abc.Person。最终我们会得到一个C++声明如下:JNIEXPORT jstring JNICALL
Java_com_abc_Person_sayHello (JNIEnv *, jobject); 所以,同样的问题,当你切换了包后,你也必须修改C++的导出声明。
将想法付诸于实践,借此来影响他人是一个人存在的真正价值