gpt4 book ai didi

java - 如何让任何用户运行从其 C++ 代码读取 Java 方法的 .exe 程序?

转载 作者:行者123 更新时间:2023-11-28 07:28:12 24 4
gpt4 key购买 nike

这里是源代码的zip文件: http://cfile218.uf.daum.net/attach/254F2D4F5211EF93107910

,或在底部可见源代码。

我刚刚在我的 PC 上编译并运行了它:在调试和 Release模式下都运行良好。

但是,如果我尝试在另一台 PC 上运行它(安装了 Windows XP),它会显示一个错误,指出我没有“jvm.dll”,因此无法运行它。

因此我从地址“http://java.com/en/download/index.jsp”安装了 java 并运行了它。但是,它仍然报同样的错误。

这是我的问题....

如何让它在没有 JDK 或 MSVC 的其他普通 PC 上运行?因为普通用户肯定不拥有 JDK..

## ================================ ##
// it is the c++ code that starts JVM and run java source code...

#include <iostream>
#include <windows.h>
#include <jni.h>

#pragma comment(lib, "jvm.lib")

using namespace std;


void main(){

cout<<"JVM Create Start!!"<<endl;

// JavaVM create & JVM environment setting start
JavaVMOption options[1];
JavaVMInitArgs vm_args;
JNIEnv *env;
JavaVM *jvm;
long status;

options[0].optionString = "-Djava.class.path=.";
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
// JavaVM create & JVM environment setting end

cout<<"JVM Operating......."<<endl;

cout<<"\n10+20?\n"<<endl;

jclass cls;
jmethodID mid;
jobject obj;
int staticresult=0;
int result=0;

if(status != JNI_ERR)
{
cls = env->FindClass("FirstJavaEx");

if(cls != 0)
{
//
// Use the static method start
//
cout<<"\t'static'start calling method" << endl;
mid = env->GetStaticMethodID(cls, "staticAdd", "(II)I");
if (mid != 0)
{
staticresult = env->CallStaticIntMethod(cls, mid, 10, 20);
cout<<"\t'static'result: " << staticresult << endl;
}
else
{
printf("mid error\n");
return;
}
//
// Use the static method end
//

//
//Create the Instance of InvokeFirstEX Class start
//
cout<<"\n\tInvokeFirstEx create instance" << endl;
jmethodID cls_constructor = env->GetMethodID(cls, "<init>", "()V");

if (cls_constructor != 0) {
obj = env->NewObject(cls, cls_constructor, "()V");
cout<<"\t\tstart calling method" << endl;
mid = env->GetMethodID(cls, "AddFunc", "(II)I");
if (mid != 0)
{
result = env->CallIntMethod(obj, mid, 10, 20);
cout<<"\t\tresult: " << result << endl;
}
else
{
printf("mid error\n");
return;
}
}
}
else
{
printf("Can't find class\n");
return;
}

jvm->DestroyJavaVM();
cout<<"\nJVM Destroyed!!"<<endl;
}

}


## ================================ ##

最佳答案

#pragma comment(lib, "jvm.lib")

因此,您的程序静态链接到 jvm.lib。这意味着当您的应用程序启动时,jvm.dll 必须位于 DLL 搜索路径(当前目录,C:\Windows\System32, %PATH%, ...)上的某个位置。 jvm.dll 可能位于您的 %PATH% 中,因此应用程序可以正常工作。但正如您也注意到的那样,通常情况并非如此。所以你必须使用不同的方法:手动加载库。

我已经写了详细的解释in another answer .这应该正是您所需要的,您只需将所有 throw gcnew System::ComponentModel::Win32Exception 替换为您自己的错误处理,因为您没有使用 C++/CLI。

编辑:您可以使用 RegQueryValueEx 而不是 RegGetValue:

RegQueryValueEx(jKey, TEXT("CurrentVersion"), NULL, NULL, versionString, &bufsize);

但是如果你看一下 documentation那个函数,你会看到你应该添加一个空终止符:

if (bufsize <= (16 * sizeof TCHAR)) // or whatever the buffer size is
versionString[bufsize] = TEXT('\0');
else // error: buffer overflow

关于java - 如何让任何用户运行从其 C++ 代码读取 Java 方法的 .exe 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18311510/

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