假设有一个hello.dll文件,里面有个函数hi(),打印一句问候的字符串。
需要用Java来调用这个动态链接库文件,并调用hi()函数,如何实现呢?
一、使用codeblocks创建dynamic link library工程
C代码如下:
demo.h
#ifndef DEMO_H_INCLUDED
#define DEMO_H_INCLUDED
#include <windows.h>
#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
void DLL_EXPORT hi();
#endif // DEMO_H_INCLUDED
demo.c
#include <stdio.h>
#include "demo.h"
void DLL_EXPORT hi()
{
printf("Nice to meet you\n");
}
构建hello工程以后,会在Debug和Release目录下生成hello.dll文件,
把这个文件复制到Java工程目录下,指定好classpath即可调用。
二、创建Java调用代码
Java代码很简单:
import com.sun.jna.Library;
import com.sun.jna.Native;
interface MyNativeLib extends Library{
String dllName = "hello";
MyNativeLib INSTANCE = (MyNativeLib)Native.loadLibrary(dllName, MyNativeLib.class);
// 动态链接库里的函数
void hi();
}
public class InvokeNativeDemo {
public void greeting(){
MyNativeLib.INSTANCE.hi();
}
public static void main(String[] args) {
InvokeNativeDemo demo = new InvokeNativeDemo();
demo.greeting();
}
}
三、如果要在C语言中调用hello.dll的hi函数,建立一个新工程Console工程test
main.c
#include <stdio.h>
#include <stdlib.h>
#include "demo.h"
int main()
{
hi();
getchar();
return 0;
}
demo.h (这个头文件和hello.dll工程的头文件一样)
#ifndef DEMO_H_INCLUDED
#define DEMO_H_INCLUDED
#include <windows.h>
#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
void DLL_EXPORT hi();
#endif // DEMO_H_INCLUDED
在build之前,需要在build option中对linker setting就行设置,指向库文件的中间文件.a文件
然后将hello.dll放入相应的Debug或者Release目录
C调用hello.dll的执行结果也为 Nice to meet you
转载于:https://blog.51cto.com/noteworthy/1591879