不能移植到dll上,每个(*env)->都报错:
type 'JNIEnv_' does not have an overloaded member 'operator ->'
换成env->就报错
'GetObjectClass' : function does not take 2 parameters
不知道是怎么回事,麻烦楼主看看

解决方案 »

  1.   

    C文件的扩展名为.c试试? 用.cpp好像会报这个错误。
      

  2.   

    欢迎呀。感谢boris2002 tx的贡献!最近确实看到不少jni相关的贴子。呵呵。
      

  3.   

    其实我对于此问题也是一知半解,只不过共享一下自己的一点经验。
    试着解释第3步:
      jfieldID fid = (*env)->GetFieldID(  env,  cls, "aValue", "I"); // 获得传入的cls类的aValue属性的句柄,"I"代表整形  jmethodID mid = (*env)->GetMethodID(  env,  cls, "divByTwo", "()V");// 获得传入的cls类的divByTwo方法的句柄,“()V”代表此方法返回void  int value = (*env)->GetIntField(env,obj, fid);// 获得aValue属性的值
      printf("Native: %d\n", value);//显示为2(java那边设置的)  (*env)->SetIntField(env,obj, fid, 6);//设置aValue属性的值为6
      (*env)->CallVoidMethod(env,obj, mid);//调用divByTwo方法,把6除2,现在的值为3  value = (*env)->GetIntField(env,obj, fid);// 再次获得aValue属性的值
      printf("Native: %d\n", value);//显示为3
      

  4.   

    谢谢boris2002()的注解,但是我还有个问题,就是(*env)->CallVoidMethod(env,obj, mid);这句中的方法没有带参数,如果我想输入参数怎么处理。谢谢啦!
      

  5.   

    爪哇人:
    我斗胆猜一把:
    如果void divByTwo( int a)
    那么应该这么用:
    jmethodID mid = (*env)->GetMethodID(  env,  cls, "divByTwo", "(I)V");
    (*env)->CallVoidMethod(env,obj, mid ,8);//a为8我有点忙,你不妨试一试,然后说一下结果。
      

  6.   

    boris2002,不行啊,他报错啊Unexpected Signal : EXCEPTION_ACCESS_VIOLATION (0xc0000005) occurred at PC=0x806
    741A
    Function=[Unknown.]
    Library=C:\j2sdk1.4.2_04\jre\bin\client\jvm.dllNOTE: We are unable to locate the function name symbol for the error
          just occurred. Please refer to release documentation for possible
          reason and solutions.
    Current Java thread:
            at test.set(Native Method)//set方法等于你的divByTwo( int a)方法
            at test.main(test.java:13)Dynamic libraries:
    0x00400000 - 0x00406000         C:\j2sdk1.4.2_04\bin\java.exe
    0x77F80000 - 0x77FFD000         C:\WINNT\system32\ntdll.dll
    0x796D0000 - 0x79732000         C:\WINNT\system32\ADVAPI32.dll
    0x77E60000 - 0x77F32000         C:\WINNT\system32\KERNEL32.DLL
    0x786F0000 - 0x78761000         C:\WINNT\system32\RPCRT4.DLL
    0x78000000 - 0x78045000         C:\WINNT\system32\MSVCRT.dll
    0x08000000 - 0x08138000         C:\j2sdk1.4.2_04\jre\bin\client\jvm.dll
    0x77DF0000 - 0x77E55000         C:\WINNT\system32\USER32.dll
    0x77F40000 - 0x77F7B000         C:\WINNT\system32\GDI32.DLL
    0x77530000 - 0x77560000         C:\WINNT\system32\WINMM.dll
    0x75E00000 - 0x75E1A000         C:\WINNT\system32\IMM32.DLL
    0x06000000 - 0x0603A000         C:\Program Files\rising\rav\ApiHook.dll
    0x05000000 - 0x05030000         C:\Program Files\rising\rav\MemMon.dll
    0x6C330000 - 0x6C338000         C:\WINNT\system32\LPK.DLL
    0x65D20000 - 0x65D74000         C:\WINNT\system32\USP10.dll
    0x10000000 - 0x10007000         C:\j2sdk1.4.2_04\jre\bin\hpi.dll
    0x00A80000 - 0x00A8E000         C:\j2sdk1.4.2_04\jre\bin\verify.dll
    0x00A90000 - 0x00AA9000         C:\j2sdk1.4.2_04\jre\bin\java.dll
    0x00AB0000 - 0x00ABD000         C:\j2sdk1.4.2_04\jre\bin\zip.dll
    0x18270000 - 0x182A3000         D:\test\jnitest\JD.dll
    0x77900000 - 0x77923000         C:\WINNT\system32\imagehlp.dll
    0x72960000 - 0x7298D000         C:\WINNT\system32\DBGHELP.dll
    0x687E0000 - 0x687EB000         C:\WINNT\system32\PSAPI.DLLHeap at VM Abort:
    Heap
     def new generation   total 576K, used 148K [0x10010000, 0x100b0000, 0x104f0000)  eden space 512K,  28% used [0x10010000, 0x10035068, 0x10090000)
      from space 64K,   0% used [0x10090000, 0x10090000, 0x100a0000)
      to   space 64K,   0% used [0x100a0000, 0x100a0000, 0x100b0000)
     tenured generation   total 1408K, used 0K [0x104f0000, 0x10650000, 0x14010000)
       the space 1408K,   0% used [0x104f0000, 0x104f0000, 0x104f0200, 0x10650000)
     compacting perm gen  total 4096K, used 1214K [0x14010000, 0x14410000, 0x1801000
    0)
       the space 4096K,  29% used [0x14010000, 0x1413f9c0, 0x1413fa00, 0x14410000)Local Time = Thu Dec 30 19:28:50 2004
    Elapsed Time = 0
    #
    # HotSpot Virtual Machine Error : EXCEPTION_ACCESS_VIOLATION
    # Error ID : 4F530E43505002EF
    # Please report this error at
    # http://java.sun.com/cgi-bin/bugreport.cgi
    #
    # Java VM: Java HotSpot(TM) Client VM (1.4.2_04-b05 mixed mode)
    #
    # An error report file has been saved as hs_err_pid1644.log.
    # Please refer to the file for further information.
    #
      

  7.   

    有机会试一下。还没用过JNI技术
      

  8.   

    爪哇人:
    顶楼的流程都已经走通了吗?
    btw:我在linux下运行的。win应该也可以。
      

  9.   

    好象没什么特别的吗。还不如java自带的jni教程呢。
      

  10.   

    boris2002():
    不带参数的方法我调通了,但是带参数的我就没办法了。好像java自带的jni教程没有这方面的例子。 你带参数的方法调通了吗?
      

  11.   

    最后一个参数是internal type signatures,用
    javap -s YourClass.class就可以看每个method的sign
      

  12.   

    to boris2002:
        你的例子里的java class too simple,在C里构造一个稍微复杂一点的Object会累死
        正解是保存一个JNIEnv和jobject的全局变量,然后callback java里的method
      

  13.   

    五星大虾终于来了
    爪哇人用winds的方法试试:javap -s YourClassto winds:本来就是想调用java类的方法,没打算在c里构造类。
      

  14.   

    如果你的JAVA CLASS 放在某个包中  应该怎么做?