Domanda

Se provo a implementare la mia classe su questo file ricevo un errore UnsatisfiedLinkError, tuttavia se rimuovo l'implementazione della classe Broker.h va bene. Perché?

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
È stato utile?

Soluzione

Probabilmente nella tua biblioteca manca il riferimento ad alcuni simboli o ad un'altra biblioteca. Prova a creare un po 'di main.cpp con la funzione main () vuota e collegalo alla tua libreria - g ++ main.cpp -o main -lInterAppCC . Se perdi qualcosa, il linker ti darà un messaggio di errore dettagliato.

PS. Poiché il file di intestazione include già il prototipo di funzione con extern " C " , non è necessario fare lo stesso quando si scrive l'implementazione.

Altri suggerimenti

Devi utilizzare esternamente " C " intorno alla roba di JNIEXPORT, per evitare la manipolazione del nome c ++ delle funzioni JNI.

La modifica del nome in C ++ modifica i nomi delle funzioni (nei file obj) per includere i tipi di parametri, virtualità, ecc. per poter collegare diverse funzioni sovraccaricate con lo stesso nome.

Quindi, avvolgi il tuo JNIEXPORT con "C" esterno {...} (guarda l'intestazione JNI) e assicurati che il tuo codice c ++ non sia racchiuso nello stesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top