5

JNI_CreateJavaVM 終了コード -1と同様の問題がありますか? ただし、私のコードは 32 ビットでコンパイルすると実行されますが、64 ビットでコンパイルすると失敗します。Windows SDK 7.1 プラットフォームを使用して、Visual Studio Express 2010 の構成ごとに JDK の場所を変更しています。私の含まれるものは次のとおりです。

C:\Program Files\Java\jdk1.6.0_29\include; (for jni.h)
C:\Program Files\Java\jdk1.6.0_29\include\win32; (for jni_md.h)

私の追加のライブラリは次のとおりです。

C:\Program Files\Java\jdk1.6.0_29\lib; (for jvm.lib and jawt.lib)

私のソース コードは、C で JVM を初期化しようとしているだけで、コマンド プロンプトが VSC++ で開いたままになるように無限にループしています。

#include "stdafx.h"
#include "jni.h"

JNIEnv* create_vm(JavaVM ** jvm);

int i;
JavaVM* jvm;
JNIEnv * env;

int _tmain(int argc, _TCHAR* argv[])
{
    printf("Hello World!");
    env = create_vm(&jvm);

    if (env == 0) { return 7; }

    i = 0;

    while (1) { i++; }

    return 0;
}

JNIEnv* create_vm(JavaVM ** jvm) {

    JavaVMInitArgs vm_args;
    int ret;
    JavaVMOption options;

    //Path to the java source code
    options.optionString = "-Djava.class.path=H:\\jarpath\\jarfile.jar";
    vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6
    vm_args.nOptions = 1;
    vm_args.options = &options;
    vm_args.ignoreUnrecognized = 0;

    ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);

    if(ret < 0)
        printf("\nUnable to Launch JVM\n");
    return env;
}

繰り返しますが、これは 32 ビット構成で機能します。唯一の違いは、JDK ルート ディレクトリが 32 ビット フォルダー (つまり、Program Files(x86)) であることです。

印刷後、

Error occurred during initialization of VM
Unable to load native library: Can't find dependent libraries

コードは、VSC++ コンソール ウィンドウに次のエラーを表示して終了します。

The program '[5684] JNI_Test.exe: Native' has exited with code 1 (0x1).

ライブラリや基本的な C コーディングに関して不足しているものはありますか? 私はしばらく C でコードを書いていませんでしたし、そもそもライブラリ全体のリンクにあまり慣れていません。

4

1 に答える 1

4

このコードを試してください (エクスポート .lib ファイルを使用せず、JNI ヘッダーと JVM.dll のみが必要です)。コマンドを使用しました

gcc -m64 -o test.exe small_test.cpp -I "C:\Program Files\Java\jdk1.6.0_25\include" -I "C:\Program Files\Java\jdk1.6.0_25\include\win32" -lstdc++

それをコンパイルするには(MinGWですが、VC++も動作するはずです。Mingwは古いMSVCRTを使用しています)

GetLastError() を確認します。64 ビット C ランタイムに何か問題があると思われます。

#include <windows.h>
#include <stdio.h>
#include <jni.h>
#include <string.h>

#define PATH_SEPARATOR ';' /* define it to be ':' on Solaris */
#define USER_CLASSPATH "." /* where Prog.class is */

typedef /*_JNI_IMPORT_OR_EXPORT_*/ jint (JNICALL *JNI_CreateJavaVM_func)(JavaVM **pvm, void **penv, void *args);

JNI_CreateJavaVM_func JNI_CreateJavaVM_ptr;

JNIEnv* create_vm(JavaVM ** jvm)
{
    JNIEnv *env;
    JavaVMInitArgs vm_args;
    JavaVMOption options;
    HMODULE jvm_dll;
    int ret;

    options.optionString = "-Djava.class.path=D:\\monotest\\src_CJNIJava\\bin"; //Path to the java source code
    vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6
    vm_args.nOptions = 1;
    vm_args.options = &options;
    vm_args.ignoreUnrecognized = 0;

    jvm_dll = LoadLibrary("C:\\Program Files\\Java\\jre6\\bin\\server\\jvm.dll");

    /// You might check the GetLastError() here after the LoadLibrary()
    if(jvm_dll == NULL) { printf("can't load dll\n"); exit(1); }

    JNI_CreateJavaVM_ptr = (JNI_CreateJavaVM_func)GetProcAddress(jvm_dll, "JNI_CreateJavaVM");

    /// You might check the GetLastError() here
    if(JNI_CreateJavaVM_ptr == NULL) { printf("can't load function\n"); exit(1); }

    ret = JNI_CreateJavaVM_ptr(jvm, (void**)&env, &vm_args);
    if(ret < 0) { printf("\nUnable to Launch JVM\n"); }
    return env;
}

int main(int argc, char* argv[])
{
    JNIEnv *env;
    JavaVM * jvm;
    env = create_vm(&jvm);

    if (env == NULL) { return 1; }

    int n = jvm->DestroyJavaVM();
    return 0;
}
于 2012-07-12T17:44:51.097 に答える