0

SWIG %native 関数を使用してネイティブ JNI 呼び出しをコンパイルしようとしていますが、ヘッダー ファイルに対して以下の例外が発生します。以下のメイクファイルに jdk-1.6.0_30/include と jdk-1.6.0_30/include/linux の両方を含めています。32ビットLinuxでコンパイルしています。

サンプル.h:

JNIEXPORT jobject JNICALL Java_test_jni_GetData (JNIEnv *, jclass);

SWIG.i:

%module Sample
%{
   #include "Sample.h"
%}
%include "Sample.h"
%typemap(jstype) DeviceId getID "com.test.jni.DeviceId"
%typemap(jtype) DeviceId getID "com.test.jni.DeviceId"
%typemap(javaout) DeviceId getID { return $jnicall; }
%native(getID) DeviceId getID();

例外:

[exec]Sample.h: Error: Syntax error in input(1).
[exec] make-3.79.1-p7: *** [sample_wrap.c] Error 1

Makefile (完全なファイルではありません):

     PACKAGE_DIR = src/java/com/test/jni
     PACKAGE = com.test.jni
     INCLUDES = -I/user/java/jdk-1.6.0_30/include/linux \
                -I/user/java/jdk-1.6.0_30/include \
                -I/user/src/include #Sample.h resides here
     CFLAGS = -Wall -fpic $(INCLUDES) -O0 -g3
     SFLAGS = -java $(INCLUDES) -package $(PACKAGE) -outdir $(PACKAGE_DIR)
4

1 に答える 1

1

私はあなたがこれを間違った順序で持っていると思います。最初に書く必要があります:

%{
JNIEXPORT jobject JNICALL Java_test_jni_GetData(JNIEnv *, jclass);
%}

あなたが書くとき:

%native (GetData) jobject GetData();

関数の宣言は、SWIGが生成するラッパーコードにすでに存在します。


%includeネイティブ関数が含まれている場合、Sample.hをそのように直接サンプリングすることはできません。SWIGプリプロセッサは、JNIEXPORTまたはJNICALLが何であるかを認識していません。これらは、マクロとして指定されていない限り、構文エラーのように見えます。

ネイティブ関数を別のヘッダーファイルに配置することをお勧めします。その場合は、そのファイルではなく、そのファイルのみ を作成します。#include%include

ただし、いくつかのオプションを開いていることに失敗すると、SWIGからネイティブ関数が非表示になります。例:

#ifndef SWIG
JNIEXPORT jobject JNICALL Java_test_jni_GetData (JNIEnv *, jclass);
#endif

ヘッダーファイルで機能するか、インターフェイスファイルを変更してSWIGがJNIEXPORTとJNICALLを無視するようにすることができます。

%module Sample
%{
   #include "Sample.h"
%}
#define JNIEXPORT
#define JNICALL
%include "Sample.h"
%typemap(jstype) DeviceId getID "com.test.jni.DeviceId"
%typemap(jtype) DeviceId getID "com.test.jni.DeviceId"
%typemap(javaout) DeviceId getID { return $jnicall; }
%native(getID) DeviceId getID();

その場合、SWIGはそれをラップしようとするだけでなく、%nativeおそらくあなたが望むものではないディレクティブを取ります!

于 2012-04-12T17:58:29.353 に答える