代码之家  ›  专栏  ›  技术社区  ›  Grumblesaurus

如何在linux中从静态加载的库中执行函数?

  •  0
  • Grumblesaurus  · 技术社区  · 6 年前

    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. 
    

    ?? 谁来做这件事?我已经试过了 dlsym documentation ,但我对C/C++太不熟悉,无法将其转换为我的情况。

    谢谢

    1 回复  |  直到 6 年前
        1
  •  2
  •   Botje    6 年前

    首先,声明一个类型(此处为 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);