¿Puedo mezclar la implementación de encabezados JNI con clases normales de C ++?
-
06-07-2019 - |
Pregunta
Si trato de implementar mi clase en este archivo, obtengo un error UnsatisfiedLinkError, sin embargo, si elimino la implementación de la clase Broker.h, todo sale bien. ¿Por qué?
Broker.h
#include "XletTable.h"
#ifndef BROKER_H_
#define BROKER_H_
class Broker {
private:
static Broker* brokerSingleton;
static XletTable *table;
// Private constructor for singleton
Broker(JNIEnv *, XletTable *);
// Get XletTable (Hash Table) that contains the...
static XletTable* getTable();
public:
virtual ~Broker();
static Broker* getInstance(JNIEnv *);
jobject callMethod(JNIEnv *, jclass, jstring, jobject, jbyteArray);
};
#endif /* BROKER_H_ */
BrokerJNI.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Broker */
#ifndef _Included_Broker
#define _Included_Broker
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Broker
* Method: callMethod
* Signature: (Ljava/lang/String;Ljava/lang/reflect/Method;[B)Ljava/lang/Object;
*/
JNIEXPORT jobject JNICALL Java_Broker_callMethod
(JNIEnv *, jclass, jstring, jobject, jbyteArray);
#ifdef __cplusplus
}
#endif
#endif
Solución
Probablemente su biblioteca no haga referencia a algún símbolo u otra biblioteca. Intente crear main.cpp con la función main () vacía y vincúlelo con su biblioteca - g ++ main.cpp -o main -lInterAppCC
. Si pierde algo, el vinculador le dará un mensaje de error detallado.
PS. Como su archivo de encabezado ya envuelve el prototipo de la función con extern " C "
, no es necesario que haga lo mismo al escribir la implementación.
Otros consejos
Necesitas usar externo '' C '' alrededor del material JNIEXPORT, para evitar el cambio de nombre de C ++ de las funciones JNI.
El cambio de nombre de C ++ cambia los nombres de las funciones (en los archivos obj) para incluir los tipos de parámetros, virtualidad, etc., para poder vincular diferentes funciones sobrecargadas con el mismo nombre.
Entonces, envuelva su JNIEXPORT con externo '' C '' {...} (mira el encabezado JNI) y asegúrate de que tu código c ++ no esté envuelto en el mismo.