使用SWIG%原生函数编译错误

问题描述:

我正在尝试使用SWIG%原生函数编译原生JNI调用,并且我得到以下头文件异常。我在下面的makefile中包含jdk-1.6.0_30/include和jdk-1.6.0_30/include/linux,任何想法?我正在编译32位Linux。使用SWIG%原生函数编译错误

Sample.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) 

我认为你在错误的顺序得到这个。您需要第一写:

%{ 
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 

在头文件会工作,或者你可以修改界面文件,以使痛饮忽略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指令!

+0

我在我的第一个问题中有一个错字,现在纠正了。 %native行是我swig.i中的最后一行,JNIEXPORT jobject JNICALL Java_test_jni_GetData(JNIEnv *,jclass);位于%native调用之前的Sample.h文件中。我认为也许有一些额外的限定符需要在Sample.h文件中进行,但只是大声思考。 – c12 2012-04-12 18:44:16

+0

@ c12 - 根据您的编辑进行更新。 – Flexo 2012-04-13 14:31:53

+0

感谢您的各种解决方案,很好的答案。我回头看看SWIG文档,看看%include和#include之间有什么不同,我得到的是SWIG进程%include函数,但忽略了#include函数。我基本上具有与我在原始问题中描述的相同的设置。告诉SWIG忽略Sample的意义何在?h(#include“Sample.h”),然后用%include“Sample.h”包含它。 – c12 2012-04-13 17:05:06