0

这里是源代码的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;
    }

}


## ================================ ##
4

2 回答 2

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

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

我已经在另一个答案中对此进行了详细解释。这应该正是您所需要的,您只需throw gcnew System::ComponentModel::Win32Exception用自己的错误处理替换所有内容,因为您没有使用 C++/CLI。

编辑:而不是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
于 2013-08-19T11:03:22.507 回答
0

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

他们不需要 JDK,在客户端上安装 JRE 就足够了。但是他们肯定需要一种访问 jvm.dll 的方法(通过将其路径添加到此处解释的 PATH 环境变量)。

于 2013-08-19T13:01:32.253 回答