[英]How to let any users run .exe program that reads java methods from its c++ code?
这里是源代码的zip文件: http : //cfile218.uf.daum.net/attach/254F2D4F5211EF93107910
或底部可见的源代码。
我只是在PC上编译并运行它:在调试和发布模式下都可以正常工作。
但是,如果我尝试在另一台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%
上的某个位置,因此该应用程序可以运行。 但是,正如您还注意到的那样,通常情况并非如此。 因此,您必须使用另一种方法:手动加载库。
我在另一个答案中对此做了详细的解释。 那应该正是您所需要的,因为您没有使用C ++ / CLI,您只需要用自己的错误处理替换所有throw gcnew System::ComponentModel::Win32Exception
。
编辑:代替RegGetValue
,您可以使用RegQueryValueEx
:
RegQueryValueEx(jKey, TEXT("CurrentVersion"), NULL, NULL, versionString, &bufsize);
但是,如果您看一下该函数的文档 ,就会发现应该添加一个空终止符:
if (bufsize <= (16 * sizeof TCHAR)) // or whatever the buffer size is
versionString[bufsize] = TEXT('\0');
else // error: buffer overflow
如何使它在没有JDK或MSVC的其他普通PC上运行? 因为普通用户绝对不拥有JDK。
他们不需要JDK,在客户端上安装JRE就足够了。 但他们绝对需要的手段来访问的jvm.dll(通过增加其路径PATH环境varialble解释这里 )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.