Я пытаюсь вызвать некоторый код 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");
Задача ещё не решена.
Других решений пока нет …