如何从dll中的本机代码/嵌入jar调用java方法

时间:2014-01-13 12:24:48

标签: java dll jar

我想用C / C ++编写一个dll并调用jar文件中包含的java方法。我在SO上找到了很多线程,反之亦然(使用jar中的dll),但对我来说并不多。所以我想知道这是否可能/合理。我认为在加载dll的机器上只需要一个匹配的jvm - 但是it seems我必须在我的dll中嵌入一个完整的jvm。在我的方案中,这将是一种过度杀伤。

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

谢谢,

1 个答案:

答案 0 :(得分:2)

  

我想用C / C ++编写一个dll并调用一个包含在java中的java方法   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 Class的主要方法的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打包到我的应用程序