【问题标题】:How to call java methods from native code / embed jar in dll如何从本机代码调用java方法/在dll中嵌入jar
【发布时间】:2014-01-13 12:24:47
【问题描述】:

我想用 C/C++ 编写一个 dll 并调用 jar 文件中包含的 java 方法。我在 SO 上发现了许多相反的线程(使用 jar 中的 dll),但对我来说并不多。所以我想知道这是否可能/合理。我认为在加载 dll 的机器上只需要一个匹配的 jvm - 但是it seems 我必须在我的 dll 中嵌入整个 jvm。在我的情况下,这将是矫枉过正。

我这样做的原因如下:我有一个能够加载具有特定接口的 dll 的第 3 方应用程序,并且我还有一个许可算法作为 jar 文件(它将检查是否在此安装了有效的许可机器 - 我这边没有这个 jar 的源代码)。所以我想编译一个只有当 jar 文件中的许可机制返回成功时才能工作的 dll。那我真的必须在我的dll中嵌入整个jvm吗?可能会出现哪些问题?关于这个主题有什么想法/建议吗?

谢谢,

【问题讨论】:

    标签: java dll jar


    【解决方案1】:

    我想用 C/C++ 编写一个 dll 并调用包含在一个 jar文件

    你必须在 c/c++ 程序中访问 jvm.dll。

    JNIEnv* create_vm(JavaVM ** jvm)
    {
    JNIEnv *env;
    JavaVMInitArgs vm_args;
    JavaVMOption options[2];
    
    options[0].optionString = "-Djava.class.path=.";
    options[1].optionString = "-DXcheck:jni:pedantic";  
    
    vm_args.version = JNI_VERSION_1_6;
    vm_args.nOptions = 2;
    vm_args.options = options;
    vm_args.ignoreUnrecognized = JNI_TRUE; // remove unrecognized options
    
    int ret = JNI_CreateJavaVM(jvm, (void**) &env, &vm_args);
    if (ret < 0) printf("\n<<<<< Unable to Launch JVM >>>>>\n");
    return env;
     }
    

    这是我准备的访问HelloWorld类的main方法的c++程序。

    int main(int argc, char* argv[])
    {
    JNIEnv* env;
    JavaVM* jvm;
    
    env = create_vm(&jvm);
    
    if (env == NULL) return 1;
    
    jclass myClass = NULL;
    jmethodID main = NULL;
    
    /* Get the Hello World Class */
    myClass = env->FindClass("HelloWorld");
    
    /* Call the main method */
    if (myClass != NULL)
        main = env->GetStaticMethodID(myClass, "main", "([Ljava/lang/String;)V");
    else
        printf("Unable to find the requested class\n");
    
    
    if (main != NULL)
    {
       env->CallStaticVoidMethod( myClass, main, " ");
    }else
       printf("main method not found") ;
    
    
    jvm->DestroyJavaVM();
    return 0;
    }
    

    编译

    g++ -D_JNI_IMPLEMENTATION_ -I"C:\Program Files\Java\jdk1.6.0_32\include" -I"C:\Program Files\Java\jdk1.6.0_32\include\win32" hello.cpp -L"C:\Program Files\Java\jre6\bin\client" -ljvm -o hello.exe
    

    此外,如果您希望将此功能扩展到 jar 文件。使用类加载器。

    我在带有 jdk 1.6 的 Windows 上使用了 MinGW。我已经测试了这段代码并在 Windows 上为我的应用程序创建了一个自定义 exe,以便将 JRE 与我的应用程序打包

    【讨论】:

    • 你为什么不解释忘记#include???????????????????????????和来自 jdk_number\lib*.lib 的 lib??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多