SWIG で生成されたコードを使用して、Java コードを C DLL に接続しています。Java コードからの呼び出しは機能し、関数が呼び出され、戻り値は正しいですが、ポインターによって渡された long の値 (関数が提供する実際のデータ) は、Java コードに到着すると失われます。
関数プロトタイプは非常に基本的な 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 と等しくなければなりません