LINUX 下 JNA 呼叫 so--正確版
阿新 • • 發佈:2018-12-24
專案中需要用到JAVA呼叫c++,瞭解過JNI,但比較複雜,後來看到JNA(JNI的加強版)。
網上看了很多例子,但是始終出錯,主要錯誤原因是undefined symbol,找不到c++ 方法。
教程的有些細節沒說(- -||),好吧,我把成功的例子貼一下吧。
1.編寫C++ so庫
c++程式碼:注意加上extern “C”,否則無法找到c++方法。
#include <stdlib.h> #include <iostream> using namespace std; extern "C" { void test() { cout << "TEST" << endl; } int addTest(int a,int b) { int c = a + b ; return c ; } }
編譯so:g++ -fpic -shared -o libtest.so test.cpp
我把so檔案放到了 /lib 下。
2.JAVA程式碼
import com.sun.jna.Library; import com.sun.jna.Native; public class jnatest1 { // 繼承Library,用於載入庫檔案 public interface Clibrary extends Library { // 載入libhello.so連結庫 Clibrary INSTANTCE = (Clibrary) Native.loadLibrary("hello", Clibrary.class); // 此方法為連結庫中的方法 void test(); int addTest(int a,int b); } public static void main(String[] args) { // 呼叫 Clibrary.INSTANTCE.test(); int c = Clibrary.INSTANTCE.addTest(10,20); System.out.println(c); } }