JNIヘッダーの実装と通常のC ++クラスを混在させることはできますか?

StackOverflow https://stackoverflow.com/questions/1627152

質問

このファイルにクラスを実装しようとすると、エラーUnsatisfiedLinkErrorが表示されますが、Broker.hクラスの実装を削除しても問題ありません。なぜですか?

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
役に立ちましたか?

解決

おそらく、ライブラリが何らかのシンボルまたは別のライブラリへの参照を見逃しています。空のmain()関数を使用してmain.cppを作成し、ライブラリ- g ++ main.cpp -o main -lInterAppCC にリンクしてみてください。何かを見逃した場合、リンカーは詳細なエラーメッセージを表示します。

PS。ヘッダーファイルは既に関数プロトタイプを extern&quot; C&quot; でラップしているため、実装を記述するときに同じことを行う必要はありません。

他のヒント

extern&quot; C&quot;を使用する必要がありますJNI関数のc ++名前マングリングを回避するための、JNIEXPORTスタッフの周り。

C ++名前マングリングは、同じ名前の異なるオーバーロードされた関数をリンクできるように、パラメーターのタイプ、仮想性などを含むように(objファイル内の)関数名を変更します。

したがって、JNIEXPORTをextern&quot; C&quot;でラップします。 {...}(JNIヘッダーを見て)、C ++コードが同じものでラップされていないことを確認します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top