使用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
指令!
我在我的第一个问题中有一个错字,现在纠正了。 %native行是我swig.i中的最后一行,JNIEXPORT jobject JNICALL Java_test_jni_GetData(JNIEnv *,jclass);位于%native调用之前的Sample.h文件中。我认为也许有一些额外的限定符需要在Sample.h文件中进行,但只是大声思考。 – c12 2012-04-12 18:44:16
@ c12 - 根据您的编辑进行更新。 – Flexo 2012-04-13 14:31:53
感谢您的各种解决方案,很好的答案。我回头看看SWIG文档,看看%include和#include之间有什么不同,我得到的是SWIG进程%include函数,但忽略了#include函数。我基本上具有与我在原始问题中描述的相同的设置。告诉SWIG忽略Sample的意义何在?h(#include“Sample.h”),然后用%include“Sample.h”包含它。 – c12 2012-04-13 17:05:06