JNI的高手来帮个忙,多谢 就说第一个错误:GetMethodID里的方法名字不能为空,构造函数的名字是"<init>"你先改了第一个错误才看,jvm当前线程如果有错误产生,后面的语句很可能不被正确执行(都报错). 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 果然是高手,多谢,我改了一下,如下:JNIEXPORT jint JNICALL Java_scanBuffer (JNIEnv *env, jobject object, jbyteArray buffer, jobject vec){ jclass cls = env->FindClass("ScanRecord"); printf("in here 1 !\nAfter FindClass ScanRecord=%p\n", cls); if(cls != 0) { jmethodID jmid = env->GetMethodID(cls, "<init>", "(ILjava/lang/String;)V"); printf("in here 2 !\nAfter GetMethodID jmid =%p\n", jmid); jobject obj = env->NewObject(cls, jmid, 1, env->NewStringUTF("abc") ); printf("in here 3 !\nAfter NewObject obj=%p\n", obj); jclass vCls = env->GetObjectClass(vec); printf("in here 4 !\nAfter GetObjectClass vCls=%p\n", vCls); if(vCls != 0) { jmethodID mid = env->GetMethodID(vCls, "add", "(Ljava/lang/Object;)Z"); printf("in here 5 !\nAfter GetMethodID add=%p\n", mid); jboolean boolRetVal = env->CallBooleanMethod(vCls, mid, obj); printf("in here 6 !\nAfter CallBooleanMethod boolRetVal=%p\n", boolRetVal); return 1; } } return 0; }出错如下:(“jvm当前线程如果有错误产生,后面的语句很可能不被正确执行”这个是对的,不过我在Jbuider8下调java代码,输出如下,如果就是在终端窗口运行java.exe输出情况有些不一样,是自己的输出代码在前面,异常代码在后面)java.lang.AbstractMethodError: java.util.Vector.add(Ljava/lang/Object;)Z at scanBuffer(Native Method) at com.kingsoft.antivirus.apiforjava.Example1.main(Example1.java:30)Exception in thread "main" in here 1 !After FindClass ScanRecord=00945218in here 2 !After GetMethodID jmid =0094B2F8in here 3 !After NewObject obj=0094522Cin here 4 !After GetObjectClass vCls=00945230in here 5 !After GetMethodID add=00942E40in here 6 !After CallBooleanMethod boolRetVal=00000000 //这个调用问题 前一帖是我同学mosin(唐僧) 代我所发,我不会给上帖分数,希望大家不用担心 出的错误好奇怪,已经不是通常的调用/参数错误了。根据JDK Doc的解释,AbstractMethodError只能是发生在编译后运行代码发生改变。可能是环境原因,也可能是你的JNI里有其他的非法代码,比如指针越界操作之类的,把jvm的数据搞坏了。关于Jbuilder和命令行输出的顺序不同,可能是因为Jbuiler控制的System.err和System.out是两个OutputStream,并且没有很好的保证同步,而控制台的环境里System.err和System.out是一个OutputStream.所以Jbuilder的输出在次序上有些问题。控制台的输出是正确的,Jbuiler的是错误的,跟java/javaw和JVM无关。 对不起,at com.kingsoft.antivirus.apiforjava.Example1.main(Example1.java:30)这一行是贴错了,应该是at JNI_class.main(JNI_class.java:30),希望这个没有让你疑惑。另外终端输出的顺序先不计较,我觉得程序的问题可能出在 CallBooleanMethod 调用Vector.add(Object)方法上,是不是Vector作为参数传递进来的调用有什么要注意的呢? 我的困惑主要在AbstractMethodError上,说实话,从来没遇到过这种错误。那个CallBooleanMethod没错。 env->CallBooleanMethod(vCls, mid, obj);应该变成env->CallBooleanMethod(vec, mid, obj);方法调用应该传入Object(实例),而不是类 问题解决了,jboolean boolRetVal = env->CallBooleanMethod(vCls, mid, obj);应该是:jboolean boolRetVal = env->CallBooleanMethod(vec, mid, obj);非常感谢taolei(实在无聊)大力帮助,分数全给你。再次感谢。 fast_time(fast_time)说的对啊,真是的,我看了好几遍也没发现这个错误。脸红中 fast_time(fast_time) 非常对不起,我发结帖的时候没有看到你的回复,所以没有给你分,下次有机会再给你吧。非常感谢你的帮助! taolei(实在无聊)别客气,非常感谢你。 问个比较烂的问题:applet界面,调用access数据库报错一大堆 请教高手正则表达试 有没有统一的录入界面??? 请教一个问题(about JTable and JComboBox) 那刚走出校门的毕业生最起码会写什么东东啊 一个java文件多个类找不到main 关于一个日期格式的小问题,但是很急 请问PreparedStatementWrapper的用法和作用? 又到年终了,祝兄弟们万事如意,多拿奖金。开始散分..... VAJ的配置问题 c++里面的unsigned char在java里不认,怎么办? 免费邮件服务!
JNIEXPORT jint JNICALL Java_scanBuffer
(JNIEnv *env, jobject object, jbyteArray buffer, jobject vec)
{ jclass cls = env->FindClass("ScanRecord");
printf("in here 1 !\nAfter FindClass ScanRecord=%p\n", cls);
if(cls != 0)
{
jmethodID jmid = env->GetMethodID(cls,
"<init>",
"(ILjava/lang/String;)V");
printf("in here 2 !\nAfter GetMethodID jmid =%p\n", jmid);
jobject obj = env->NewObject(cls,
jmid,
1,
env->NewStringUTF("abc") );
printf("in here 3 !\nAfter NewObject obj=%p\n", obj);
jclass vCls = env->GetObjectClass(vec);
printf("in here 4 !\nAfter GetObjectClass vCls=%p\n", vCls);
if(vCls != 0)
{
jmethodID mid = env->GetMethodID(vCls, "add", "(Ljava/lang/Object;)Z");
printf("in here 5 !\nAfter GetMethodID add=%p\n", mid);
jboolean boolRetVal = env->CallBooleanMethod(vCls, mid, obj);
printf("in here 6 !\nAfter CallBooleanMethod boolRetVal=%p\n", boolRetVal);
return 1;
}
}
return 0;
}出错如下:(“jvm当前线程如果有错误产生,后面的语句很可能不被正确执行”这个是对的,不过我在Jbuider8下调java代码,输出如下,如果就是在终端窗口运行java.exe输出情况有些不一样,是自己的输出代码在前面,异常代码在后面)
java.lang.AbstractMethodError: java.util.Vector.add(Ljava/lang/Object;)Z at scanBuffer(Native Method) at com.kingsoft.antivirus.apiforjava.Example1.main(Example1.java:30)Exception in thread "main" in here 1 !After FindClass ScanRecord=00945218in here 2 !After GetMethodID jmid =0094B2F8in here 3 !After NewObject obj=0094522Cin here 4 !After GetObjectClass vCls=00945230in here 5 !After GetMethodID add=00942E40in here 6 !After CallBooleanMethod boolRetVal=00000000 //这个调用问题
控制台的输出是正确的,Jbuiler的是错误的,跟java/javaw和JVM无关。
那个CallBooleanMethod没错。
env->CallBooleanMethod(vec, mid, obj);方法调用应该传入Object(实例),而不是类
应该是:jboolean boolRetVal = env->CallBooleanMethod(vec, mid, obj);非常感谢taolei(实在无聊)大力帮助,分数全给你。再次感谢。
真是的,我看了好几遍也没发现这个错误。
脸红中