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)