0

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 と等しくなければなりません

4

0 に答える 0