У меня есть скомпилированная библиотека, которую мне нужно использовать в проекте. Короче говоря, это библиотека для взаимодействия с определенным оборудованием. У меня есть файлы библиотек .a и .dll, соответственно для linux и windows, и куча заголовков C ++ .h со всеми описанными там общими функциями и классами.
Проблема в том, что проекту необходимобыть на Java, поэтому мне нужно написать оболочку JNI для этой библиотеки, и, честно говоря, я никогда не делал этого. Но ничего страшного, я должен это изучить.
Я прочитал в Интернете кучу документации и выяснил, как передавать переменные, создавать объекты Java из собственного кода и т. Д.
Что я не могу понять, так это как работать с нативными конструкторами с использованием JNI? Я понятия не имею, каков исходный код этих конструкторов, у меня есть только такие заголовки:
namespace RFDevice {
class RFDEVICE_API RFEthernetDetector
{
public:
//-----------------------------------------------------------------------------
// FUNCTION RFEthernetDetector::RFEthernetDetector
/// \brief Default constructor of RFEthernetDetector object.
///
/// \return void : N/A
//-----------------------------------------------------------------------------
RFEthernetDetector();
RFEthernetDetector(const WORD wCustomPortNumber);
Так что, в принципе, если бы я должен был написать свою программу на C ++ (что я не могу), ябудет делать что-то вроде
RFEthernetDetector ethernetDetector = new RFEthernerDetector(somePort);
, а затем работать с этим объектом. Но ... Как мне сделать это в Java с помощью JNI? Я не понимаю, как я должен создать собственный метод для конструктора, который будет вызывать конструктор из моей библиотеки .a, а затем иметь какой-то способ работы с этим конкретным объектом? Я знаю, как создавать Java-объекты из собственного кода, но дело в том, что у меня нет никакой информации о внутренней структуре класса RFEthernetDetector - только некоторые из его открытых полей и открытых методов.
И я могу 'Кажется, я не нашел нужных статей в сети, чтобы помочь мне. Как мне это сделать?
Обновление: немного дальнейших разъяснений.
Я создаю класс-оболочку .java следующим образом:
public class RFEthernetDetector
{
public RFEthernetDetector(int portNumber)
{
Init(portNumber);
}
public native void Init(int portNumber); // Void? Or what?
}
, затем компилирую его с -Параметр h для создания файла JNI .h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class RFEthernetDetector */
#ifndef _Included_RFEthernetDetector
#define _Included_RFEthernetDetector
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: RFEthernetDetector
* Method: Init
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_RFEthernetDetector_Init
(JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif
Затем я создаю реализацию, которая будет вызывать функции из моей библиотеки .a:
#include "RFEthernetDetector.h" // auto-generated JNI header
#include "RFEthernetDetector_native.h" // h file that comes with the library,
//contains definition of RFEthernetDetector class
/*
* Class: RFEthernetDetector
* Method: Init
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_RFEthernetDetector_Init(JNIEnv *env, jobject thisObj, jint value)
{
RFEthernetDetector *rfeDetector = new RFEthernetDetector(value); // constructor from the library
// now how do I access this new object from Java?
// if I need to later call rfDetector->doSomething() on that exact class instance?
}