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::Win32ExceptionC++/CLI を使用していないため、すべてを独自のエラー処理に置き換える必要があります。

編集:代わりにRegGetValue、次を使用できますRegQueryValueEx

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

しかし、その関数のドキュメントを見ると、null ターミネータを追加する必要があることがわかります。

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 に答える