2009年6月3日 星期三

JNative DEMO 實做

參考了一下 平乐天地的文章


我的環境如下
以下分兩個階段

1. dll 建立
透過 vc6 建立,過程同平乐天地的文章

建立專案

add.h:
#define DLLEXPORT extern "C" _declspec(dllexport)
DLLEXPORT int addTest(int a, int b);
DLLEXPORT char* getString();

add.cpp:
#include "add.h";
int addTest(int a, int b)
{
return a+b;
}
char* getString()
{
char* test = "this is test";
return test;
}

DLL 建立可參考這兩篇文章
http://hi.baidu.com/44997/blog/item/dcf47b59198b2d2a2934f0e1.html
http://blog.csdn.net/askAloe/archive/2006/09/08/1192522.aspx

2. java 端讀取 dll

以下是我修改後的範例
編譯前記得匯入jnative.jar



import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;


public class LoadDllDemo {


public static final String GetString() throws NativeException,IllegalAccessException
{
JNative n = null;
String str=null;

try {

// 取得dll JNative(dll位址, 函數名稱);
n = new JNative("add.dll", "getString");

// 設定回傳質類型
n.setRetVal(Type.STRING);

// 使用方法
n.invoke();

// 取得回傳值
str=n.getRetVal();

return str;

} finally {
if (n != null)
// relase
n.dispose();
}

}


public static final int addTest(int a, int b) throws NativeException,IllegalAccessException
{
JNative n = null;
int x=0;

try {

// 取得dll JNative(dll位址, 函數名稱);
n = new JNative("add.dll", "addTest");

// 設定回傳質類型
n.setRetVal(Type.INT);

// 設定傳入參數 setParameter(位置, 類型 , 值)
// 值 必須是 string
n.setParameter(0, Type.INT, ""+a);
n.setParameter(1, Type.INT, ""+b);

// 使用方法
n.invoke();

// 取得回傳值
x=Integer.parseInt(n.getRetVal());

return x;

} finally {
if (n != null)
// relase
n.dispose();
}

}




public static void main(String[] args) throws NativeException, IllegalAccessException{

System.out.println("LoadDllDemo 的 String : ");
System.out.println(LoadDllDemo.GetString());
System.out.println("------------------------------------------------- ");
System.out.println("LoadDllDemo 的 addTest function : 5+7= ");
System.out.println(LoadDllDemo.addTest(5,7));

}
}

沒有留言: