JNI 的调用问题,请高手们指教一下,谢谢了 ~
我有个问题 请问下各位
我现在有个vb的 .dll文件 ,里面函数为
closecomm(comm_value& )
参数为 comm_value 的结构为
Public Type Comm_value
com_port As String * 3 //传入参数
dis_value As String * 40 //传出参数
data_len As String * 2 //传出参数
End Type
现在我使用jni的方法 重新用c++写个dll让java 调用
代码如下
main.h
class comm_value{
public:
char com_port[10];
char dis_value[40];
char data_len[2];
};
typedef int __stdcall (*SendCard_c_mcom_set)(comm_value& value);
typedef int __stdcall (*SendCard_closecomm)(comm_value& value);
main.cpp
JNIEXPORT jint JNICALL Java_SendCardJava_closecomm
(JNIEnv *env, jobject, jobject comm)
{
jclass commValueCls = env->FindClass("Comm_Value");
jfieldID fid_CommValue_comport = env->GetFieldID(commValueCls,"com_port","Ljava/lang/String;");
jobject proCommport = env->GetObjectField(comm,fid_CommValue_comport);
jstring ppCommPort = (jstring)env->GetObjectField(proCommport,fid_CommValue_comport);
char * comportStr =(char*)env->GetStringUTFChars(ppCommPort,NULL);
jfieldID fid_CommValue_disvalue = env->GetFieldID(commValueCls,"dis_value","Ljava/lang/String;");
jobject proDisvalue = env->GetObjectField(comm,fid_CommValue_disvalue);
jfieldID fid_CommValue_DataLen = env->GetFieldID(commValueCls,"data_len","Ljava/lang/String;");
jobject proDataLen = env->GetObjectField(comm,fid_CommValue_DataLen);
HINSTANCE DLLHandle;
SendCard_closecomm sc_closecomm;
int close_result = 0;
DLLHandle = LoadLibrary("D:\\DGD4V3.0\\sendcard.dll"); //
if (DLLHandle) //call crmp timeout hook
{
try
{
comm_value value ;
strcpy(value.com_port,comportStr) ;
sc_closecomm = (SendCard_c_mcom_set)GetProcAddress(DLLHandle,"closecomm");
if (sc_closecomm)
{
close_result = sc_closecomm(value);
// env->SetObjectField(proDisvalue,fid_CommValue_disvalue,env->NewStringUTF(value.dis_value)) ;
// env->SetObjectField(proDataLen,fid_CommValue_DataLen,env->NewStringUTF(value.data_len )) ;
}
}catch(...)
{
}
}
return close_result;
}
java 代码
public class SendCardJava {
public native int closecomm(Comm_value Comm_value);
static
{
System.loadLibrary("JavaSendCard");
}
}
调用
public class SendCardJavaDLLApp {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SendCardJava sendCardJava = new SendCardJava();
Comm_value comm = new Comm_value();
comm.com_port = "COM1";
System.out .println("Close Result : " + sendCardJava.closecomm(comm));
System.out.println("Data Len: " + comm.data_len );
System.out .println("Dis Value: " + comm.dis_value );
}
现在报错误
#
# An unexpected error has been detected by Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d890e20, pid=4312, tid=6096
#
# Java VM: Java HotSpot(TM) Client VM (1.6.0-b105 mixed mode, sharing)
# Problematic frame:
# V [jvm.dll+0xd0e20]
希望各位能帮忙解决下 谢谢