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
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top