Question

Si j'essaie d'implémenter ma classe sur ce fichier, une erreur apparaît: UnsatisfiedLinkError. Cependant, si je supprime l'implémentation de la classe Broker.h, tout va bien. Pourquoi?

Courtier.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
Était-ce utile?

La solution

Votre bibliothèque manque probablement de référence à un symbole ou à une autre bibliothèque. Essayez de créer un fichier main.cpp avec une fonction main () vide et liez-le à votre bibliothèque - g ++ main.cpp -o main -lInterAppCC . Si vous manquez quelque chose, l’éditeur de liens vous enverra un message d’erreur détaillé.

PS. Étant donné que votre fichier d’en-tête encapsule déjà le prototype de fonction avec extern "" " C ", vous n’êtes pas obligé de faire la même chose lors de l’écriture de l’implémentation.

Autres conseils

Vous devez utiliser extern " C " autour des commandes JNIEXPORT, afin d’éviter que les fonctions JNI ne se mélangent.

C ++ name mangling modifie les noms des fonctions (dans les fichiers obj) pour inclure les types de paramètres, virtual-ness, etc., afin de pouvoir lier différentes fonctions surchargées portant le même nom.

Alors, enveloppez votre JNIEXPORT avec extern "C". {...} (regardez l’en-tête de JNI) et assurez-vous que votre code c ++ n’est pas encapsulé de la même manière.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top