2015-12-04 2 views
0

Я создал C++ функцию для сложения двух чисел:JNI Связывание в Java

#include <iostream> 
extern "C" __declspec(dllexport) 
int add (int x, int y) 
{ 
    return x + y; 
} 

и создал два класса в Java, чтобы получить доступ к нему с помощью ЮНА:

package jniTest; 
public class jnitest { 
    public static void main(String[] args) { 

     System.setProperty("java.library.path", "C:/cygwin/home/abc"); 
     System.loadLibrary("add"); 

     importClass lib = importClass.INSTANCE; 
     System.out.println(lib.add(10, 20)); 
    } 
} 

Главный тестовый класс:

package jniTest; 

import com.sun.jna.Library; 
import com.sun.jna.Native; 

public interface importClass extends Library 
{ 
    importClass INSTANCE = (importClass) Native.loadLibrary("add", importClass.class); 
    int add(int x, int y); 
} 

Я получаю следующее сообщение об ошибке: "Исключение из потока" main "java.lang.UnsatisfiedLinkError: no add in java.library.path «

+1

называется Ваш файл библиотеки "добавить"? – immibis

+0

Я предполагаю, что файл библиотеки - это файл C++, который я создал для добавления двух функций, и имя файла добавляется. Это верно? жаль, что я новичок в этом домене. – bna

+0

Нет, вам нужно скомпилировать его, как и любая другая программа или библиотека C++. – immibis

ответ

0

Я считаю, что большинство ваших проблем вызвано и много путаницы в комментариях, думая, что вы используете JNI напрямую, а не JNA.

Поскольку вы используете JNA, вы должны установить jna.library.path, а не java.library.path, и вы не должны вызывать System.loadLibrary(), как если бы вы использовали JNI напрямую.

Измените основной класс:

package jniTest; 
public class jnitest { 
    public static void main(String[] args) { 

     // changed java to jna in next line. 
     System.setProperty("jna.library.path", "C:/cygwin/home/abc"); 
     // remove this line System.loadLibrary("add"); 

     importClass lib = importClass.INSTANCE; 
     System.out.println(lib.add(10, 20)); 
    } 
} 
Смежные вопросы