загрузить lib .so с помощью jna - PullRequest
0 голосов
/ 15 мая 2018

Я на самом деле пытаюсь открыть библиотеку.Итак (я сделал это на C ++) с JNA, моя проблема в том, что я не могу открыть библиотеку, когда есть статическая переменная.Однако я должен использовать un singleton в моей библиотеке, поэтому я ищу, почему статическая переменная не может быть использована с JNA, чтобы доказать, что она сделала небольшую библиотеку

есть файл .h:

#ifndef UNTITLED1_LIBRARY_H
#define UNTITLED1_LIBRARY_H
#include <iostream>
class library {
 private:
  static char* h;
 public:
  int hello();
};

extern "C" int hello(){
 library lib;
 return lib.hello();
}

#endif

затем мой файл .cpp:

#include "library.h"
#include "ecrire.h"

#include <iostream>

int library::hello() {
 h = (char*)"hello world";
 std::cout<<h<<std::endl;
 return 45;
}

затем мой класс java и интерфейс

public class Westgard {
static {       
    System.setProperty("jna.library.path","../logic/resources/calculator"); 
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    int maj = InterfaceLibWestgard.INSTANCE.hello();
    System.out.println(maj);
}

}


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

public interface InterfaceLibWestgard extends Library {
  int hello();
  static InterfaceLibWestgard INSTANCE = (InterfaceLibWestgard) 
  Native.loadLibrary("../logic/resources/calculator/libuntitled1.so", 
  InterfaceLibWestgard.class);
}

Так что, если я попытаюсь, как это, он не будет работать, но когда удалить статическийиз .h это работает, никто не знает, почему я искал с 4-5 часов до сих пор не знаю, почему ...

Это мой журнал проблем:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load 
 library '../logic/resources/calculator/libuntitled1.so': Native library 
(linux-x86-64/../logic/resources/calculator/libuntitled1.so) not found in 
resource path ([file:/opt/java/jdk1.8.0_151/jre/lib/resources.jar, 

1 Ответ

0 голосов
/ 15 мая 2018

Вы объявили library::h, но не определили его. Вам нужно добавить

char* library::h = 0;

в вашем файле cpp.

Предположительно, библиотека либо не может скомпилироваться, либо компилируется, но ожидает, что этот отсутствующий символ будет определен в другой библиотеке.

...