Я только знакомлюсь с jni/java и рабочим процессом, в котором мы хотим вызывать методы, написанные в собственном коде, но я пока не могу понять, как можно использовать JNI, если собственная библиотека C++ имеет абстрактную версию C++ класс, подобный приведенному ниже, который может быть унаследован C++ для создания конкретных классов C++, но также может быть расширен классом Java
class NumberInterface {
public:
using Numbers = std::unordered_set;
/**
* Getter to receive all numbers.
*
* @return Numbers.
*/
virtual Numbers getSupportedNumbers() = 0;
virtual bool handleNumber(unsigned int number) = 0;
virtual bool cancelNumber(unsigned int number) = 0;
};
Таким образом, если это общая библиотека, а не собственная, какая-то библиотека может ссылаться на нее, и она может иметь числовой класс, как показано ниже.
class Number : public NumberInterface {
public:
Numbers getSupportedNumbers() override;
bool handleNumber(unsigned int number) override;
bool cancelNumber(unsigned int number) override;
...
};
Что я пока не могу понять, так это то, что на стороне Java, если у меня есть библиотека/apk, которая должна использовать эту собственную служебную библиотеку, как я могу структурировать свою утилита или jni, чтобы у нас мог быть класс Java, расширяющий NumberInterface.
class JavaNumber extends JavaNumberInterfaceEquivalent {
...
}
----отредактировано, чтобы добавить фрагмент кода перемещения ---
я хочу, чтобы класс util также имел NumberManagerInterface, как показано ниже
/// NumberManagerInterface that can handle numbers.
class NumberInterface {
public:
/**
* Register modules that handle numbers.
*
* @return true if successful, false otherwise.
*/
virtual bool registerNumberModule(const std::shared_ptr& module) = 0;
virtual bool handleNumber(const unsigned int number) = 0;
virtual bool cancelNumber(const unsigned int number) = 0;
};
/**
* Sample NumberManager class.
*
*/
class NumberManager : public NumberManagerInterface{
public:
static std::shared_ptr createNumberManagerInstance(...);
bool registerNumberModule(const std::shared_ptr& module) override;
bool handleNumber(const unsigned int number) override;
bool cancelNumber(const unsigned int number) override;
...
private:
std::vector m_numberHandlers;
...
};
bool NumberManager::registerNumberModule(const std::shared_ptr& module){
// do some validation
m_numberHandlers.insert(module);
...
return true;
}
bool NumberManager::handleNumber(const unsigned int number){
//find the correct handler from m_numberHandlers
//call the correct handler
return handler->handleNumber(number);
}
void NumberManager::cancelNumber(const unsigned int number){
...
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... ract-class