1. 程式人生 > >LINUX 下 JNA 呼叫 so--正確版

LINUX 下 JNA 呼叫 so--正確版

專案中需要用到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); 
	}
}