任何一本程式語言書籍,都會有HelloWorld。原本標題想叫Basic JNA,但我認為算基礎的東西實在太多,如果都寫出來讀者很難消化。在這我用簡單的範例,教大家如何透過JNA去呼叫dll與so。
Native Code
首先撰寫windows與linux的dll,function名稱為helloWorld,實做為輸出HelloWorld!到Console中。
Windows
JNAHelloWorld.h:
#ifdef JNAHELLOWORLD_EXPORTS #define JNAHELLOWORLD_API __declspec(dllexport) #else #define JNAHELLOWORLD_API __declspec(dllimport) #endif JNAHELLOWORLD_API void helloWorld(void);
JNAHelloWorld.cpp:
#include "stdafx.h" #include "JNAHelloWorld.h" #include <iostream> using namespace std; JNAHELLOWORLD_API void helloWorld(void) { cout << "Hello World!" << endl; }
Linux
helloWorld.h:
void helloWorld();
helloWorld.cpp:
#include <iostream> using namespace std; void helloWorld(){ cout << "Hello World!" << endl; }
Java Code
native code產生的artifact分別為JNAHelloWorld.dll與libJNAHelloWorld.so。所需撰寫的程式碼非常簡單,有下面三個步驟:
- 建立要透過JNA呼叫dll的Class,範例為CHellWorld。
- 透過Native類別去loadLibrary。
- 使用之前必須設定jna.library.path,設定dll/so路徑。
package org.tonylin.practice.jna; import com.sun.jna.Library; import com.sun.jna.Native; public class HelloWorld { public interface CHelloWorld extends Library{ CHelloWorld instance = (CHelloWorld) Native.loadLibrary("JNAHelloWorld", CHelloWorld.class); public void helloWorld(); } public static void main(String[] args) { System.setProperty("jna.library.path", "./libs"); CHelloWorld.instance.helloWorld(); } }
必須注意執行此程式的java環境,如果是32位元jvm,就必須使用32位元的dll;如果為64位元,就必須使用64位元的dll。
執行結果
以下為windows執行結果:
Java與C程式透過JNA的溝通,有需多需要注意的細節。如型態、dll宣告方式等,都有可能造成程式的問題,之後有時間會把曾經遇到過的問題整理給大家。
留言
張貼留言