就说第一个错误:GetMethodID里的方法名字不能为空,构造函数的名字是"<init>"
你先改了第一个错误才看,jvm当前线程如果有错误产生,后面的语句很可能不被正确执行(都报错).

解决方案 »

  1.   

    果然是高手,多谢,我改了一下,如下:
    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  //这个调用问题
      

  2.   

    前一帖是我同学mosin(唐僧) 代我所发,我不会给上帖分数,希望大家不用担心
      

  3.   

    出的错误好奇怪,已经不是通常的调用/参数错误了。根据JDK Doc的解释,AbstractMethodError只能是发生在编译后运行代码发生改变。可能是环境原因,也可能是你的JNI里有其他的非法代码,比如指针越界操作之类的,把jvm的数据搞坏了。关于Jbuilder和命令行输出的顺序不同,可能是因为Jbuiler控制的System.err和System.out是两个OutputStream,并且没有很好的保证同步,而控制台的环境里System.err和System.out是一个OutputStream.所以Jbuilder的输出在次序上有些问题。
    控制台的输出是正确的,Jbuiler的是错误的,跟java/javaw和JVM无关。
      

  4.   

    对不起,at com.kingsoft.antivirus.apiforjava.Example1.main(Example1.java:30)这一行是贴错了,应该是at JNI_class.main(JNI_class.java:30),希望这个没有让你疑惑。另外终端输出的顺序先不计较,我觉得程序的问题可能出在 CallBooleanMethod 调用Vector.add(Object)方法上,是不是Vector作为参数传递进来的调用有什么要注意的呢?
      

  5.   

    我的困惑主要在AbstractMethodError上,说实话,从来没遇到过这种错误。
    那个CallBooleanMethod没错。
      

  6.   

    env->CallBooleanMethod(vCls, mid, obj);应该变成
    env->CallBooleanMethod(vec, mid, obj);方法调用应该传入Object(实例),而不是类
      

  7.   

    问题解决了,jboolean boolRetVal = env->CallBooleanMethod(vCls, mid, obj);
    应该是:jboolean boolRetVal = env->CallBooleanMethod(vec, mid, obj);非常感谢taolei(实在无聊)大力帮助,分数全给你。再次感谢。
      

  8.   

    fast_time(fast_time)说的对啊,
    真是的,我看了好几遍也没发现这个错误。
    脸红中
      

  9.   

    fast_time(fast_time) 非常对不起,我发结帖的时候没有看到你的回复,所以没有给你分,下次有机会再给你吧。非常感谢你的帮助!
      

  10.   

    taolei(实在无聊)别客气,非常感谢你。