Я пытаюсь разработать java-программу, которая использует код C++. Для этой цели я использую 32-битное mingw, 32-битное jre (версия 1.8.0_77) и eclipse luna (64 бит).Ошибка при использовании интерфейса Java Native
Проблема
У меня есть проблемы, пытаясь загрузить * .dll. (Я не пытался запустить любой метод еще)
Что я испытал
Это класс, где я объявил нативный метод:
public class JniImports {
static{
System.loadLibrary("hello");
}
public int test(int n){
return testJava(n);
}
private native int testJava(int n);
}
И это Основной метод:
public class Main {
public static void main(String[] args) {
JniImports a = new JniImports();
}
}
Я настроил аргументы для JVM на затмение добавив это: -Djava.library.path=./jni
Файл c-header был сгенерирован инструментом javah
, поэтому я уверен, что все в порядке. Во всяком случае, как я уже сказал, я не пытался выполнить какой-либо метод. Здесь заголовочный файл:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jnitest_JniImports */
#ifndef _Included_com_jnitest_JniImports
#define _Included_com_jnitest_JniImports
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_jnitest_JniImports
* Method: testJava
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_jnitest_JniImports_testJava
(JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif
А вот файл CPP:
#include "com_jnitest_JniImports.h"
JNIEXPORT jint JNICALL Java_com_jnitest_JniImports_testJava
(JNIEnv *env, jobject _this, jint n){
return 12;
}
Вот команда, которую я использую для компиляции (г ++ является MinGW 32-бит): g++ -Wl,--add-stdcall-alias -I"%JDK32_HOME%\include" -I"%JDK32_HOME%\include\win32" -shared -o hello.dll com_jnitest_JniImports.cpp
Ошибки
Если я использую 64-разрядную JRE, ошибка в том, что она не может загрузить 32-разрядную dll на 64-разрядной версии:
java.lang.UnsatisfiedLinkError: D:\ws\testjni\jni\hello.dll Can't load IA 32-bit .dll on a AMD 64-bit platform
Я думаю, что эта ошибка показывает, что в этом случае JRE находит * .dll.
Если я использую 32-бит JRE, ошибка в том, что он не может найти * .dll:
java.lang.UnsatisfiedLinkError: D:\ws\testjni\jni\hello.dll: Can't find dependent libraries
Если я использую 32-бит JRE и я удалить привет. DLL библиотека, это ошибка: java.lang.UnsatisfiedLinkError: no hello in java.library.path
Таким образом, составление C++ кода с 32-битным компилятором и с помощью 32-разрядной JRE, он может найти DLL, но он выходит из строя в любом случае.
Я также попытался скомпилировать код C++ в режиме отладки (с флагом -g), а также сбой.
Я уверен, что dll находится в правильном месте, потому что, если я скопирую путь, отображаемый в журнале ошибок в строке пути проводника окна, он доставит меня в папку, где находится dll, и я Я уверен, что его имя «hello.dll».