Как выполнить функцию из статически загруженной библиотеки в Linux? - PullRequest
0 голосов
/ 04 декабря 2018

Я пишу собственный лаунчер в Linux для Java-программы.Модуль запуска должен статически загружать libjvm.so и выполнять функцию JNI_CreateJavaVM() через указатель функции, чтобы я мог запустить исполняемый файл без необходимости предварительно устанавливать LD_LIBRARY_PATH.

У меня есть это до сих пор, и я понял, как скомпилировать и связать его, но я борюсь с синтаксисом для объявления указателя на функцию, а затем выполнить функцию:

JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption* options = new JavaVMOption[10];

...

std::string location = "./jre/lib/server/libjvm.so";
void *handle = dlopen ( location.c_str(), RTLD_LAZY );

if ( !handle ) {
   printf ( "Unable to load %s, exiting", location.c_str() );
   return 0;
}

?? = dlsym ( handle, "JNI_CreateJavaVM" ); //get the function pointer

//This is how I would execute the function if dynamically linking: 
//JNI_CreateJavaVM( &jvm, (void**)&env, &vm_args );

?? ( &jvm, (void**)&env, &vm_args ); //Execute the function pointer. 

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

Спасибо!

1 Ответ

0 голосов
/ 04 декабря 2018

Сначала объявите тип (здесь p_JNI_CreateJavaVM) для функции, которую вы хотите получить:

typedef jint (*p_JNI_CreateJavaVM)(JavaVM**, void**, void**);
p_JNI_CreateJavaVM JNI_CreateJavaVM = (p_JNI_CreateJavaVM)dlsym(handle, "JNI_CreateJavaVM");

И вы можете вызывать ее как обычно:

jint ret = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
...