Java/c/c++調用DLL
1、Java調用DLL(通過VS2010):
百度上有很多例子,不過因為自己的VC6.0不好用,是以我是在VS2010上面配置的:
Step One:
在Eclipse/MyEclipse上面建立一個Java的工程:
public class TestJNI
{
static
{
System.loadLibrary("TestJNI");
}
public static native void sayHello(String msg);
public static void main(String[] args)
{
sayHello("Hello,this is my first JNI program !");
}
}
Step Two:
在指令行裡面,相應的目錄下面輸入:
javac TestJNI.java --->生成了一個TestJNI.class檔案
javah TestJNI--->生成一個TestJNI.h檔案
Step Three:
1、建立一個工程,選擇Win32Project-->next
2、選擇dll工程--->finish
3、将TestJNI.h、\Java\jdk1.6.0_10\include下面的jni.h、\Java\jdk1.6.0_10\include\win32下面的jawt_md.h放到TestJNI\TestJNI下面,然後通過Solution Explorer-->Header Files-->Add-->Existing Item添加這三個檔案
4、修改stdafx.h檔案:
Step Four:
1、編輯TestJNI.cpp的檔案:
// TestJNI.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
#include "TestJNI.h"
JNIEXPORT void JNICALL Java_TestJNI_sayHello(JNIEnv * env, jclass obj, jstring jMsg)
{
const char *strMsgPtr = env->GetStringUTFChars( jMsg , 0);
MessageBox( 0, TEXT("Hello World!"), TEXT("Tip"), 0 );
env->ReleaseStringUTFChars( jMsg, strMsgPtr);
}
注意:編譯的時候會出現:
,不要擔心,因為在檔案夾裡面還是會生成出現dll檔案,這個好像是因為dll是需要程式去調用它的,現在沒有程式是以會報錯的原因。
2、打開工程屬性,選擇Configuration Properties --->VC++ Directories--->include Directories 添加jdk路徑下的include和/include/win32目錄,這裡包含jni.h等頭檔案
3、build工程,打開工程目錄的debug目錄,将其中生成的TestJNI.dll考到java工程的java.library.path目錄下(一般的是系統的system32目錄),當然也可在工程的配置裡面配置java.library.path目錄為dll檔案所在的目錄
Step Five:
正常情況下就可以了
2、在C/C++裡面調用DLL:
Step One:
打開VC6.0建立一個DLL: 1、檔案-->工程-->Win32 Dynamic-Link Library-->工程名稱(如:dll) 2、建立一個c檔案-->檔案-->建立-->C++ Source File-->工程名稱(如dllDemo.c),複制以下内容:
#include <windows.h>
#include "dlldemo.h"
int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) {
return TRUE ;
}
EXPORT void add() {
printf("Hello World!");
}
3、建立一個.h的檔案-->檔案-->建立-->文本檔案-->工程名稱(如:dll),複制下面内容:
#include <windows.h>
#include "dlldemo.h"
int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) {
return TRUE ;
}
EXPORT void add() {
printf("Hello World!");
}
Step Two:
建立一個c檔案來調用dll檔案: 在建立的c檔案下,複制以下内容:
#include <WINDOWS.H>
#include <WINBASE.H>
#include <stdio.h>
typedef int (*MYPROC)();
int main()
{
HINSTANCE LibHandle;
MYPROC ProcAdd;
char dllbuf[] = "dll.dll";//dll的路徑
char sysbuf[] = "add"; /*過程名*/
LibHandle = LoadLibrary(dllbuf); /*載入dll*/
ProcAdd = (MYPROC)GetProcAddress(LibHandle, sysbuf); /*擷取函數sysbuf的位址*/
(ProcAdd)();
}
運作即可。