Java调用Dll

参考文章:http://blog.csdn.net/gcangle/article/details/8504629

一、生成dll文件
不会写C代码的同学,建议下一个Dev-cpp来练手,新建一个Dll项目,将其中的.cpp文件和.h文件内容改成以下代码:
①main.h 改写成

#ifndef __MAIN_H__  
#define __MAIN_H__  

#include <windows.h>  

/*  To use this exported function of dll, include this header 
 *  in your project. 
 */  

#ifdef BUILD_DLL  
    #define DLL_EXPORT __declspec(dllexport)  
#else  
    #define DLL_EXPORT __declspec(dllimport)  
#endif  


#ifdef __cplusplus  
extern "C"  
{  
#endif  

int add(int a,int b);  
int factorial(int n);  

#ifdef __cplusplus  
}  
#endif  

#endif // __MAIN_H__  

②main.cpp改写成

#include "main.h"  

int add(int a,int b){  
    return a + b;  
}  
int factorial(int n){  
    int i;  
    int r = 1;  
    for(i=1;i<n+1;i++)  
        r = r*i;  
    return r;  
}  

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)  
{  
    switch (fdwReason)  
    {  
        case DLL_PROCESS_ATTACH:  
            // attach to process  
            // return FALSE to fail DLL load  
            break;  

        case DLL_PROCESS_DETACH:  
            // detach from process  
            break;  

        case DLL_THREAD_ATTACH:  
            // attach to thread  
            break;  

        case DLL_THREAD_DETACH:  
            // detach from thread  
            break;  
    }  
    return TRUE; // succesful  
} 

然后点击项目属性,设置生成dll文件的名称路径,然后编译,就可以在你指定的目录找到扩展名为dll的文件。

将这个dll文件复制到Java安装目录下的bin目录中,文件名称是可以更改的。

二、java代码

①编写一个interface

public interface JNATestDll extends Library {
    JNATestDll instanceDll = (JNATestDll) Native.loadLibrary("mydll", JNATestDll.class);

    public int add(int a, int b);

    public int factorial(int n);
    public int asd(int n);//这个方法dll中不存在
}

mydll这个名称需要和刚才复制到bin目录下的文件名称一致

②编写测试类

    @Test
    public void test3() {
        int add = JNATestDll.instanceDll.add(2, 3);
//      int ft = JNATestDll.instanceDll.factorial(10);
        System.out.println("add = " + add);
    }

如果正常输出结果,表示java调用dll成功。

JNI也是可以实现的,实现比较复杂,函数名称需要根据java包名等对应,参数类型也需要对应。

我在开发中,碰到一个问题是,dll中要求传一个c++里面的Socket对象,不知道该怎么传参,查了很多资料无果,希望有高手帮忙指点一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值