古怪的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++的导出声明。

posted @ 2010-06-13 16:38  moonz-wu  阅读(190)  评论(1编辑  收藏  举报