0

我正在尝试使用 SWIG %native 函数编译本机 JNI 调用,并且我得到头文件的以下异常。我在下面的 makefile 中同时包含 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 回答