不能移植到dll上,每个(*env)->都报错:
type 'JNIEnv_' does not have an overloaded member 'operator ->'
换成env->就报错
'GetObjectClass' : function does not take 2 parameters
不知道是怎么回事,麻烦楼主看看
type 'JNIEnv_' does not have an overloaded member 'operator ->'
换成env->就报错
'GetObjectClass' : function does not take 2 parameters
不知道是怎么回事,麻烦楼主看看
试着解释第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
我斗胆猜一把:
如果void divByTwo( int a)
那么应该这么用:
jmethodID mid = (*env)->GetMethodID( env, cls, "divByTwo", "(I)V");
(*env)->CallVoidMethod(env,obj, mid ,8);//a为8我有点忙,你不妨试一试,然后说一下结果。
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.
#
顶楼的流程都已经走通了吗?
btw:我在linux下运行的。win应该也可以。
不带参数的方法我调通了,但是带参数的我就没办法了。好像java自带的jni教程没有这方面的例子。 你带参数的方法调通了吗?
javap -s YourClass.class就可以看每个method的sign
你的例子里的java class too simple,在C里构造一个稍微复杂一点的Object会累死
正解是保存一个JNIEnv和jobject的全局变量,然后callback java里的method
爪哇人用winds的方法试试:javap -s YourClassto winds:本来就是想调用java类的方法,没打算在c里构造类。