我正在使用SWIG生成的代码将我的Java代码连接到C DLL。 来自Java代码的调用工作,函数被调用并且返回值是正确的,但是一旦到达Java代码,指针传递的long(这是函数给出的真实数据)的值就会丢失。
由于函数原型是非常基本的C,我希望它可以工作,但事实并非如此。
你知道我应该改变什么吗?
谢谢。
DLL函数原型:
long viOpenDefaultRM (unsigned long * vi);
SWIG生成的C代码:
SWIGEXPORT jint JNICALL Java_visa_1javaJNI_viOpenDefaultRM(JNIEnv *jenv,
jclass jcls, jlong jarg1) {
jint jresult = 0 ;
unsigned long *arg1 = (unsigned long *) 0 ;
long result;
(void)jenv;
(void)jcls;
arg1 = *(unsigned long **)&jarg1;
result = (long)viOpenDefaultRM(arg1);
jresult = (jint)result;
printf("C: jarg1 = %d\n", jarg1); // added for debug
return jresult;
}
调用本机方法的Java代码:
SWIGTYPE_p_unsigned_long defaultRM = new SWIGTYPE_p_unsigned_long();
int status = visa_java.viOpenDefaultRM(defaultRM);
System.out.println("defaultRM = " + SWIGTYPE_p_unsigned_long.getCPtr(defaultRM));
终端输出:
C: jarg1 = 79348104
defaultRM = 0
问题: defaultRM应该等于jarg1