jni swig

jni - Error de compilación utilizando la función nativa SWIG%



(1)

Creo que tienes esto en el orden equivocado. Primero debes escribir:

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

para que cuando escribas:

%native (GetData) jobject GetData();

ya existe una declaración de la función en el código del contenedor que SWIG generará.

No puede %include Sample.h directamente así si tiene funciones nativas. El preprocesador SWIG no sabe qué son JNIEXPORT o JNICALL: se parecen a los errores de sintaxis a menos que se hayan dado como una macro.

Sugiero poner las funciones nativas en un archivo de encabezado separado que solo %include #include , no %include ese archivo.

Sin embargo, si tiene varias opciones abiertas, ocultando la función nativa de SWIG, por ejemplo:

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

en el archivo de encabezado funcionaría, o podría modificar el archivo de interfaz para hacer que SWIG ignore JNIEXPORT y 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();

Aunque en ese caso SWIG intentará ajustarlo y tomar la directiva %native que probablemente no sea la que usted quiere.

Estoy intentando compilar una llamada JNI nativa usando la función nativa SWIG% y obtengo la excepción a continuación para el archivo de encabezado. Estoy incluyendo tanto jdk-1.6.0_30 / include como jdk-1.6.0_30 / include / linux en el archivo MAKE a continuación, ¿Alguna idea? Estoy compilando en 32 bits de Linux.

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

Excepción:

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

Makefile (archivo no completo):

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)