2012-04-11 14 views
0

Ich versuche, einen nativen JNI-Aufruf mit der SWIG% native Funktion zu kompilieren, und ich bekomme die folgende Ausnahme für die Header-Datei. Ich schließe sowohl die jdk-1.6.0_30/include und jdk-1.6.0_30/include/linux in das Makefile ein, Irgendwelche Ideen? Ich kompiliere auf 32bit Linux.Kompilierfehler mit SWIG% native Funktion

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(); 

Ausnahme:

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

Makefile (nicht vollständige Datei):

 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) 

Antwort

1

Ich glaube, Sie dies in der falschen Reihenfolge haben. Sie müssen erste schreiben:

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

so dass, wenn Sie schreiben:

%native (GetData) jobject GetData(); 

eine Deklaration der Funktion existiert bereits in der Wrapper-Code, der SWIG generiert.


Sie können nicht %include Sample.h direkt wie, dass, wenn es in ihm native Funktionen steckt. Der SWIG-Präprozessor weiß nicht, was JNIEXPORT oder JNICALL sind - sie sehen wie Syntaxfehler aus, wenn sie nicht als Makro angegeben wurden.

Ich würde vorschlagen, die nativen Funktionen in einer separaten Header-Datei, die Sie dann nur#include, nicht %include, die Datei setzen.

Failing, dass Sie zwar mehrere Optionen offen haben, die native Funktion von SWIG versteckt, zB:

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

in der Header-Datei funktionieren würde, oder Sie können die Interface-Datei ändern, um SWIG zu machen ignorieren JNIEXPORT und JNICALL : in diesem Fall

%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(); 

Obwohl SWIG wird versuchen, es so gut zu wickeln, wie nehmen Sie die %native Richtlinie, die ist wahrscheinlich nicht das, was Sie wollen!

+0

Ich hatte einen Tippfehler in meiner ersten Frage, jetzt korrigiert. Die% native Zeile ist die letzte Zeile in meinem swig.i und dem JNIEXPORT-Jobject JNICALL Java_test_jni_GetData (JNIEnv *, jclass); befindet sich in der Sample.h-Datei, die vor dem% nativen Aufruf enthalten ist. Ich denke, vielleicht gibt es einen zusätzlichen Qualifier eines Typs, der in die Sample.h-Datei für die Funktion gehen muss, aber nur laut nachdenken muss. – c12

+0

@ c12 - basierend auf Ihrer Bearbeitung aktualisiert. – Flexo

+0

danke für die verschiedenen Lösungen, große Antwort. Ich ging zurück und schaute auf die SWIG-Dokumentation, um zu sehen, was der Unterschied zwischen% include vs #include ist und was ich bekomme, ist SWIG-Prozesse% include-Funktionen, aber ignoriert #include-Funktionen. Ich habe grundsätzlich das gleiche Setup, wie ich es in meiner ursprünglichen Frage beschrieben habe. Was soll SWIG sagen, Sample zu ignorieren?h (#include "Sample.h"), aber dann include% include "Sample.h" – c12