Puis-je mélanger la mise en œuvre des en-têtes JNI avec des classes C ++ normales?
-
06-07-2019 - |
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
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.