====================求助 JNI ======

winco304 2010-04-15 11:09:08
我在使用JAVA调用C的时候 出现了 EXCEPTION_ACCESS_VIOLATION 的错误 .网上提这个问题的不在少数,可是解决方法都是比较范范的,希望哪位朋友能够帮忙深入的分析一下。ps:本人做JAVA的,以前没有涉及过C的开发,希望能够借此得到大家的指点。小弟在此先行谢过。

错误代码如下:
#
# An unexpected error has been detected by Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x030b7252, pid=3824, tid=2256
#
# Java VM: Java HotSpot(TM) Client VM (1.6.0_01-b06 mixed mode, sharing)
# Problematic frame:
# C [twssadfs.dll+0x7252]
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#

--------------- T H R E A D ---------------

Current thread (0x0544cc00): JavaThread "Thread-99" [_thread_in_native, id=2256]

siginfo: ExceptionCode=0xc0000005, reading address 0x00000000

Registers:
EAX=0x00000000, EBX=0x00000000, ECX=0x00000000, EDX=0x00000000
ESP=0x0663f434, EBP=0x00000001, ESI=0x03163260, EDI=0x031632a5
EIP=0x030b7252, EFLAGS=0x00010206

Top of Stack: (sp=0x0663f434)
0x0663f434: 0544cc00 0544cce8 0663f4c4 26b4aad8
0x0663f444: 00000001 003d0201 030bbcc6 00000000
0x0663f454: 00000000 0388ffb0 00000001 00000000
0x0663f464: 00000000 03046854 00000001 00000000
0x0663f474: 0388ffb0 1000197d 00000001 00000000
0x0663f484: 0388ffb0 26b4aad8 0097a460 0544cce8
0x0663f494: 0663f4cc 00000001 0663f4d8 0663f4d4
0x0663f4a4: 0663f4a4 26b4aad8 0663f4dc 26b4f1c0

Instructions: (pc=0x030b7252)
0x030b7242: 8b 3c d5 20 f8 0c 03 8b 54 24 20 83 c7 2d f3 ab
0x030b7252: 8a 0a 8d 46 15 3a cb 74 0d 2b d0 88 08 8a 4c 02


Stack: [0x065f0000,0x06640000), sp=0x0663f434, free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [twss.dll+0x7252]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j tc16dfJ.StartCallOut(ILjava/lang/String;Ljava/lang/String;)I+0
J IntMonitor.run()V
v ~StubRoutines::call_stub

--------------- P R O C E S S ---------------

Java Threads: ( => current thread )
.......

Other Threads:
0x02ac3800 VMThread [id=1720]
0x02b18c00 WatcherThread [id=3088]

VM state:not at safepoint (normal execution)

VM Mutex/Monitor currently owned by a thread: None

Heap
def new generation total 960K, used 394K [0x229d0000, 0x22ad0000, 0x22eb0000)
eden space 896K, 43% used [0x229d0000, 0x22a32820, 0x22ab0000)
from space 64K, 0% used [0x22ab0000, 0x22ab0030, 0x22ac0000)
to space 64K, 0% used [0x22ac0000, 0x22ac0000, 0x22ad0000)
tenured generation total 4096K, used 2628K [0x22eb0000, 0x232b0000, 0x269d0000)
the space 4096K, 64% used [0x22eb0000, 0x23141078, 0x23141200, 0x232b0000)
compacting perm gen total 12288K, used 3432K [0x269d0000, 0x275d0000, 0x2a9d0000)
the space 12288K, 27% used [0x269d0000, 0x26d2a1a0, 0x26d2a200, 0x275d0000)
ro space 8192K, 66% used [0x2a9d0000, 0x2af1c5d0, 0x2af1c600, 0x2b1d0000)
rw space 12288K, 52% used [0x2b1d0000, 0x2b818c98, 0x2b818e00, 0x2bdd0000)

VM Arguments:
java_command: runServer -s test 8002 SetParam 8001 CallSvr 8000
Launcher Type: SUN_STANDARD

Environment Variables:
JAVA_HOME=D:\ek\jdk
PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;D:\MySQL\MySQL Server 5.2\bin
USERNAME=Administrator
OS=Windows_NT
PROCESSOR_IDENTIFIER=x86 Family 6 Model 23 Stepping 10, GenuineIntel



--------------- S Y S T E M ---------------

OS: Windows Server 2003 family Build 3790 Service Pack 2

CPU:total 2 family 6, cmov, cx8, fxsr, mmx, sse, sse2

Memory: 4k page, physical 2097151k(2097151k free), swap 4194303k(4194303k free)

vm_info: Java HotSpot(TM) Client VM (1.6.0_01-b06) for windows-x86, built on Mar 14 2007 00:24:02 by "java_re" with unknown MS VC++:1310


================================================
另外:我在c的接口用如下两个方法进行string 与char*的转换
char* StrChgChar (JNIEnv * env,jstring inStr) {
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("gb2312");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr = (jbyteArray)env->CallObjectMethod(inStr, mid, strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
if (alen > 0) {
rtn = (char*)malloc(alen + 1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr, ba, 0);
return rtn;
}

jstring CharChgStr(JNIEnv* env, const char *pat) {
//定义java String类 strClass
jclass strClass = (env)->FindClass("Ljava/lang/String;");
//获取java String类方法String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
jbyteArray bytes = (env)->NewByteArray(strlen(pat));//建立byte数组
(env)->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);//将char* 转换为byte数组
jstring encoding = (env)->NewStringUTF("gb2312"); // 设置String, 保存语言类型,用于byte数组转换至String时的参数
return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);//将byte数组转换为java String,并输出
}
...全文
45 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovebin_bin 2010-04-16
  • 打赏
  • 举报
回复
看著頭暈了 呵呵

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧