浠婂ぉ鍋剁劧鐪嬪埌浜咼NA鐨勪粙緇嶏紝涓嬭澆涓嬫潵璇曚簡涓涓嬶紝寰堝ソ鐢紝鐩告瘮杈僇NI瑕佺畝鍗曞緢澶氥傚仛浜嗕竴涓彲浠allback鐨刢++鍔ㄦ侀摼鎺ュ簱錛屽疄鐜頒簡java鍜宑++鐨勪簰鐩歌皟鐢ㄣ?/p>
1銆佸紑鍙戠幆澧冿細
寮鍙戝伐鍏鳳細Netbeans 6.8錛屽寘鍚簡Java鍜孋++寮鍙戞彃浠訛紝鐢ㄤ竴涓伐鍏鋒瘮杈冩柟渚匡紝鍙互鍚屾椂寮鍙慍++鐨刣ll鍜孞ava浠g爜銆?/p>
C++鐜錛歁ingW 5.1.6+MSYS銆乬++ 3.4.5
Java鐜錛欽DK 1.6.0_18
2銆丆++浠g爜
鐢∟etbeans鍒涘緩涓涓姩鎬侀摼鎺ュ簱欏圭洰JNALib錛屽垱寤轟竴涓猚++婧愭枃浠禼lib.cpp錛岀敓鎴愮粨鏋滀負libJNALib.dll
#include <stdlib.h>
#include <iostream>
using namespace std;
extern "C"


{
typedef void (*OpenFunc)(const char*,int);

OpenFunc openfunc = NULL;


void init(OpenFunc func)
{
cout << "init called" <<endl;
openfunc = func;
}


void test()
{

if (openfunc == NULL)
{
cout << "openfunc is NULL" << endl;
}
(*openfunc)("test", 0);
}
}

娉ㄦ剰錛氬叾涓璒penFunc澹版槑浜嗕竴涓洖璋冪被鍨嬶紝涔熷氨鏄竴涓嚱鏁版寚閽堬紝鍙互閫氳繃init灝唈ava涓殑OpenFunc鏂規硶浼犻掕繘鏉ワ紝璁劇疆榪欎釜鍑芥暟鎸囬拡錛屽姝や竴鏉ワ紝鍙互瀹炵幇C++鍒癑ava鐨勫洖璋冦?/p>
3銆丣ava浠g爜
鍒涘緩涓涓狫ava欏圭洰JNADemo錛屽垱寤轟竴涓寘clibtest錛屽垱寤轟互涓媕ava浠g爜錛?/p>
package clibtest;

import com.sun.jna.Callback;
import com.sun.jna.Library;



public interface CLib extends Library
{


public interface OpenFunc extends Callback
{
void invoke(String filename, int i);
}
void init(OpenFunc openfunc);
void test();
}


package clibtest;

import com.sun.jna.Native;


public class hello
{


public static void main(String[] args)
{
// Loading dynamically the library
CLib lib = (CLib) Native.loadLibrary("libJNALib", CLib.class);


lib.init(new CLib.OpenFunc()
{


public void invoke(String filename, int i)
{
System.out.println("callback called.");
System.out.println(filename);
}
});

lib.test();
}
}


4銆侀」鐩粨鏋勫涓?/strong>

5銆佺紪璇慍++欏圭洰錛岀敓鎴恖ibJNALib.dll錛屾嫹璐濆埌JNADemo涓葷洰褰曪紝鐩綍緇撴瀯濡備笅錛?/strong>

6銆佽繍琛岀▼搴忥紝緇撴灉濡備笅錛?/strong>


]]>