gpt4 book ai didi

java - 如何从 native 代码/在 dll 中嵌入 jar 调用 java 方法

转载 作者:行者123 更新时间:2023-11-30 04:04:29 25 4
gpt4 key购买 nike

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

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

谢谢

最佳答案

I want to write an dll in C/C++ and call java methods contained in an jar file

您必须在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 文件。使用类加载器。

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

关于java - 如何从 native 代码/在 dll 中嵌入 jar 调用 java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21091259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com