java — загружает и запускает класс OSGi в комплекте из приложения C ++ с использованием JNI

Я пытаюсь вызвать некоторый код Java в комплекте OSGi из приложения C ++ (если быть точным, игры UE4).

/* Finding and calling the createJVM function. */
typedef jint(JNICALL *createJVMfunction)(JavaVM **, void **, void *);
createJVMfunction createJVM = (createJVMfunction)GetProcAddress(jvmDll, "JNI_CreateJavaVM");
jint res = createJVM(&jvm, (void**)&env, &vm_args);
if (res == JNI_OK)
{
jclass dataClass = env->FindClass("org/example/simulation/panel/panelsimulation");

if (dataClass == nullptr) {
exit(EXIT_FAILURE);

Однако, это терпит неудачу на методе FindClass JNI. Скорее всего из-за глобального пути к классам с его собственным загрузчиком классов, конфликтующим с собственными загрузчиками классов OSGI. OSGI не использует глобальный загрузчик классов. DataClass остается NULL и, таким образом, выходит из кода.

#define classPath   "-Djava.class.path=C:/Eclipse workspace/app/example.simulation.panel/generated/example.simulation.panel.jar"

Каково было бы решение для этого? В предыдущих ответах предлагался вспомогательный класс, представляющий пакет, включая собственный загрузчик классов и вызывающий этот метод из C ++. Я не уверен, как подойти к этому, и если это лучшее решение.

Редактировать: Я нашел некоторую дополнительную информацию относительно вспомогательного класса. Разоблачение класса через разоблачение связки. Как можно было бы заполнить «bundle bundle =», и будет ли это правильным подходом? Как можно заполнить Bundle Bundle?

 public static Class<?> getNativeClass() {
// Find bundle from system bundle context.
Bundle bundle = ... // details left out.

return bundle.loadClass("org.example.Native");

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]