Могу ли я смешать реализацию заголовков JNI с обычными классами C ++? - PullRequest
1 голос
/ 26 октября 2009

Если я пытаюсь реализовать свой класс в этом файле, я получаю ошибку 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

Ответы [ 2 ]

2 голосов
/ 27 октября 2009

Возможно, ваша библиотека пропустила ссылку на какой-либо символ или другую библиотеку. Попробуйте создать main.cpp с пустой функцией main () и связать его с вашей библиотекой - g++ main.cpp -o main -lInterAppCC. Если вы что-то упустили, компоновщик выдаст вам подробное сообщение об ошибке.

PS. Поскольку ваш заголовочный файл уже содержит прототип функции с extern "C", вам не нужно делать то же самое при написании реализации.

2 голосов
/ 26 октября 2009

Вам нужно использовать extern "C" вокруг JNIEXPORT, чтобы избежать искажения имен в C ++ функций JNI.

Манглинг имен в C ++ изменяет имена функций (в obj-файлах) для включения типов параметров, виртуальности и т. Д., Чтобы иметь возможность связывать различные перегруженные функции с одним и тем же именем.

Итак, оберните ваш JNIEXPORT с помощью extern "C" {...} (посмотрите на заголовок JNI) и убедитесь, что ваш код на C ++ не заключен в то же самое.

...