2016-04-24 4 views
0

Я пытаюсь разработать 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».

ответ

0

Я тестировал его с последней версией eclipse (32 бит), и он работает. Я не знаю, было ли это ошибкой затмения, или проблема в том, что я использую 64-битное затмение, и теперь я использую 32-разрядную версию.

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