2013-09-10 4 views
2

Я хочу написать программу на C++, которая вызывает метод Java.нерешенный внешний символ __imp__JNI_CreateJavaVM @ 12 ссылка

Я пытаюсь вызвать функцию Java из C++. Как описано здесь

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; 
} 

Java установлена ​​на моём компе версии C: \ Users \ уу> JAVA -версия Java версии "1.7.0_17" Java (TM) SE Runtime Environment (сборка 1.7.0_17-b02) Java HotSpot (TM) 64-разрядная серверная 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(); 
    } 
} 
} 

ответ

3

Я решил проблему. Ошибка:

unresolved external symbol [email protected] referenced 

потому, что jvm.lib не будучи связан с.

Его можно решить двумя способами.

Первая ссылка на jvm.dll динамически во время выполнения с помощью LoadLibrary:

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); 

Во-вторых, связать jvm.lib к вашему проекту.

Щелкните правой кнопкой мыши по проекту -> свойства.

В диалоговом окне Свойства

добавить jvm.lib под Linker-> вход-> области AdditionalDependencies.

И написать jvm.lib путь под Linker-> общ-> AdditionalLibraryDirectories

+0

за то, что стоит, я обнаружил, что есть jvm.lib в моей установке jdk (java 1.6), которая составляет около 299k и jvm.lib в моей установке jre, которая составляет около 553k. Когда я связываюсь с версией в библиотеке jdk, я получаю эту нерешенную внешность, когда я использую lib из jre, он ссылается без ошибок. Надеюсь, это поможет кому-то. – stu

+0

^ДА ДА ЭТО. Я люблю тебя. :) – Phixle

3

Ошибка:

unresolved external symbol _imp[email protected] referenced

потому, что jni.lib не быть связан с: добавить его в список библиотек для связи с (не знаю, где, как я не знаком с VS IDE. Путь, где находится файл jni.lib, также должен быть указан где-то).

Отметьте, что new[] должно быть delete[] d, а не delete d (по-видимому, нет причин для динамического выделения памяти).

+0

1) Должен ли я добавить его в программу Java или C++. 2) Я искал свой диск C и не смог найти файл jni.lib, чтобы добавить его в список библиотек для связи. –

+0

@HorasanLee, добавьте его в C++ и будет находиться под '$ JAVA_HOME \ lib'. – hmjd

+0

Нет файла jni.lib в любом месте. Я unistalled Java 1.7 и установлен 1.6 ничего не изменилось. Нет файла jni.lib, чтобы указать путь. –

3

Я решил ошибку:

unresolved external symbol [email protected] referenced 

, установив правильную версию JDK для конфигурации приложения. Я установил 64-разрядную версию JDK на Windows 7 (64-разрядную) машину. Однако мое приложение было 32-битным. Я отключил 64-битную версию JDK и установил 32-разрядную версию. Впоследствии не было ошибки связывания.

+0

для меня решение было именно этим, но не нужно удалять 64-битную версию, просто исправить пути зависимостей, чтобы указать на папку программ «x86». – TechNyquist

Смежные вопросы