JNI 헤더 구현을 일반 C ++ 클래스와 혼합 할 수 있습니까?
-
06-07-2019 - |
문제
이 파일에서 클래스를 구현하려고하면 불만족스럽지 않은 오류가 발생하지만 Broker.h 클래스의 구현을 제거하면 괜찮습니다. 왜요?
브로커 .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.cpp를 만들어서 라이브러리와 연결하십시오. g++ main.cpp -o main -lInterAppCC
. 무언가를 놓치면 링커가 자세한 오류 메시지를 제공합니다.
추신. 헤더 파일은 이미 기능 프로토 타입을 랩핑하므로 extern "C"
, 구현을 작성할 때 똑같이 할 필요는 없습니다.
다른 팁
JNI 기능의 C ++ 이름 관리를 피하려면 JNIEXPORT 주변의 외부 "C"를 사용해야합니다.
C ++ 이름 Mangling은 기능 이름 (OBJ-Files)을 변경하여 매개 변수 유형, 가상성 등을 포함하여 다른 이름으로 다른 과부하 기능을 동일한 이름으로 연결할 수 있습니다.
따라서 extern "c"{...} (jni 헤더를 보면)로 jniexport를 감고 C ++-코드가 동일하게 래핑되지 않은지 확인하십시오.
제휴하지 않습니다 StackOverflow