如何访问我自己的 JNA 本地库? (包括完整示例)

问题描述 投票:0回答:0

出于某种原因,我无法使用 JNA 来运行简单的 HelloWorld。一定是我想念的愚蠢的东西。对不起,如果这是一个愚蠢的问题,但我到处都看过但我无法让它工作。

在我的 Linux 机器上,我正在做:

$ java -version
java version "17.0.6" 2023-01-17 LTS
Java(TM) SE Runtime Environment (build 17.0.6+9-LTS-190)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.6+9-LTS-190, mixed mode, sharing)

$ cat /etc/issue
Ubuntu 22.04.2 LTS \n \l

HelloJNA.java

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

public class HelloJNA {

    public interface Add extends Library
    {
        Add INSTANCE = Native.load("HelloJNA", Add.class);
        void sayHello();
    }
    static public void main(String argv[]) {
          Add lib = Add.INSTANCE;
          lib.sayHello();
    }
}

HelloJNA.cpp

#include <iostream>

using namespace std;

void sayHello() {
    cout << "Hello from C++ (JNA)!" << endl;
}

javac -cp lib/jna-5.6.0.jar:. HelloJNA.java

g++ -std=c++11 -shared -fPIC HelloJNA.cpp -o libHelloJNA.so

java -cp lib/jna-5.6.0.jar:. HelloJNA

我得到:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'sayHello': /home/jorge/jna/libHelloJNA.so: undefined symbol: sayHello
    at com.sun.jna.Function.<init>(Function.java:252)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:600)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:576)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:562)
    at com.sun.jna.Library$Handler.invoke(Library.java:243)
    at jdk.proxy1/jdk.proxy1.$Proxy0.sayHello(Unknown Source)
    at HelloJNA.main(HelloJNA.java:13)
java java-native-interface jna
© www.soinside.com 2019 - 2024. All rights reserved.