4

Java メソッドを呼び出す C++ プログラムを作成したいと考えています。

C++ から Java 関数を呼び出そうとしています。ここに記載されているように

http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/invocation.html

しかし、デバッグ中にこのエラーが発生し、処理できません。私はVisual Studio 2012を使用しています。これが私のコードC++コードです。

#include "stdafx.h"
#include <jni.h>       /* where everything is defined */

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
JavaVM *jvm;       /* denotes a Java VM */
JNIEnv *env;       /* pointer to native method interface */
JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */
JavaVMOption* options = new JavaVMOption[1];
options[0].optionString = "-Djava.class.path=C:\\Users\\yv\\workspace\\JNI\\bin";    // my class is under this directory. 

vm_args.version = 0x00010006; 
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = false;

/* load and initialize a Java VM, return a JNI interface
 * pointer in env */
JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);  // I got err msg "cannot convert parameter 2 from 'JNIEnv **' to 'void **' " so added (void **) as described in some other sources    

delete options;
jvm->DestroyJavaVM();


return 0;
}

私の comp バージョンにインストールされている Java は C:\Users\yv>JAVA -version java version "1.7.0_17" Java(TM) SE Runtime Environment (build 1.7.0_17-b02) Java HotSpot(TM) 64-Bit Server VM (ビルド 23.7-b01、混合モード)

必要に応じて私のJavaコード。

public class jniClass {
/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println("Hello, World!");
    System.out.println("Arguments sent to this program:");
    if (args.length == 0) {
        System.out.println("(None)");
    } else {
        for (int i=0; i<args.length; i++) {
            System.out.print(args[i] + " ");
        }
        System.out.println();
    }
}
}
4

3 に答える 3

5

エラーを解決しました:

unresolved external symbol _imp_JNI_CreateJavaVM@12 referenced

アプリケーション構成に適したバージョンの JDK をインストールします。Windows 7 (64 ビット) マシンに 64 ビット バージョンの JDK をインストールしました。ただし、私のアプリケーションは 32 ビットでした。64 ビットの JDK バージョンをアンインストールし、32 ビットをインストールしました。その後、リンク エラーは発生しませんでした。

于 2014-05-30T11:56:10.357 に答える
3

問題を解決しました。エラー:

unresolved external symbol _imp_JNI_CreateJavaVM@12 referenced

jvm.lib がリンクされていないためです。

それは2つの方法で解決できます。

LoadLibrary を使用して、実行時に動的に jvm.dll に最初にリンクします。

 HINSTANCE hinstLib = LoadLibrary(TEXT("D:\\desired_jvm\\jre6\\bin\\client\\jvm.dll"));
 typedef jint (JNICALL *PtrCreateJavaVM)(JavaVM **, void **, void *);
 PtrCreateJavaVM ptrCreateJavaVM = (PtrCreateJavaVM)GetProcAddress(hinstLib,"JNI_CreateJavaVM");
 jint res = ptrCreateJavaVM(&jvm, (void**)&env, &vm_args);

2 つ目は、jvm.lib をプロジェクトにリンクすることです。

プロジェクトを右クリック -> プロパティ。

[プロパティ] ダイアログ ボックスで

Linker->Input->AdditionalDependencies 領域の下に jvm.lib を追加します。

そして、Linker->General->AdditionalLibraryDirectories の下に jvm.lib パスを記述します。

于 2013-10-21T05:52:40.333 に答える
3

エラー:

未解決の外部シンボル _ imp _JNI_CreateJavaVM@12 が参照されました

jni.libがリンクされていないためです:リンクするライブラリのリストに追加します(VS IDEに慣れていないため、どこにあるかわかりません。jni.libファイルが存在するパスもどこかに指定する必要があります)。

d ではなくd でnew[]なければならないことに注意してください(メモリを動的に割り当てる理由はないようです)。delete[]delete

于 2013-09-10T09:14:29.240 に答える