我想用 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 与我的应用程序打包