您的位置:首页 > 编程语言 > C语言/C++

Java调用vs环境下C++编写的动态链接库

2017-07-07 10:49 489 查看
一、VS下生成dll文件(代码来自博文①)

MyCode.h:

#ifndef _MYCODE_H_

#define _MYCODE_H_

#ifdef DLLDEMO1_EXPORTS

#define EXPORTS_DEMO _declspec( dllexport )

#else

#define EXPORTS_DEMO _declspec(dllimport)

#endif

extern "C" EXPORTS_DEMO int Add(int a, int b);

#endif


MyCode.cpp:

#include "stdafx.h"

#include "MyCode.h"

int Add(int a, int b)

{

return (a + b);

}


解决方案配置选择release,平台配成x64,编译完成后去工程的release目录下复制dll文件,拷到Java工程里。

二、Java工程

CSDN.NET下载jna-4.2.1.jar包导入Java工程:

 Dll_Demo.java:

package test;

import com.sun.jna.Library;

import com.sun.jna.Native;

import com.sun.jna.Platform;

import implementation.JNATestDll;

public class Dll_Demo {

//public interface CLibrary extends Library {

//CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),CLibrary.class);

//void printf(String format, Object... args);

//}



public static void main(String[] args) {

//CLibrary.INSTANCE.printf("Hello, World/n");

System.out.println(JNATestDll.instanceDll.Add(1, 2));

//for (int i = 0; i < args.length; i++) {

//CLibrary.INSTANCE.printf("Argument %d: %s/n", i, args[i]);

//}

}

}


JNATestDll.java:

package implementation;

import com.sun.jna.Library;

import com.sun.jna.Native;


import test.Dll_Demo;


public interface JNATestDll extends Library {

    JNATestDll instanceDll  = (JNATestDll)Native.loadLibrary("DllDemo1",JNATestDll.class);  

    public int Add(int a,int b);  

    //public int factorial(int n);  

}


注意:

Java Build
Path导入包和把包复制到lib下是有区别的,它俩其实不会冲突,也没有什么关系的,Java Build
Path是我们编译需要的包,在比如在import ***.***.***时如果没用java Build
Path导入包的话类里面就有红叉,说不识别这个类;

导入到lib下是程序运行时需要的包,即便用Java Build Path导入过的包,没放到lib下,运行项目时会出现ClassNotFoundException的异常. 

在buildpath里面添加jar,注意路径必须是本地“/../..."

参考的博文:
①vs开发dll(dll意义、使用、函数导出方式):http://www.jellythink.com/archives/111
②vs编写动态链接库详细步骤:http://blog.csdn.net/sunxiaoju/article/details/51175505
③Java调用dll文件两种方法(jna、jnative):http://www.cnblogs.com/huozhong/p/5830485.html

PS:还是集成开发环境强大啊啊啊,纠结了一个小时的命令行,换eclipse十几分钟搞定!

一、VS下生成dll文件(代码来自博文①)

MyCode.h:

#ifndef _MYCODE_H_

#define _MYCODE_H_

#ifdef DLLDEMO1_EXPORTS

#define EXPORTS_DEMO _declspec( dllexport )

#else

#define EXPORTS_DEMO _declspec(dllimport)

#endif

extern "C" EXPORTS_DEMO int Add(int a, int b);

#endif


MyCode.cpp:

#include "stdafx.h"

#include "MyCode.h"

int Add(int a, int b)

{

return (a + b);

}


解决方案配置选择release,平台配成x64,编译完成后去工程的release目录下复制dll文件,拷到Java工程里。

二、Java工程

CSDN.NET下载jna-4.2.1.jar包导入Java工程:

 Dll_Demo.java:

package test;

import com.sun.jna.Library;

import com.sun.jna.Native;

import com.sun.jna.Platform;

import implementation.JNATestDll;

public class Dll_Demo {

//public interface CLibrary extends Library {

//CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),CLibrary.class);

//void printf(String format, Object... args);

//}



public static void main(String[] args) {

//CLibrary.INSTANCE.printf("Hello, World/n");

System.out.println(JNATestDll.instanceDll.Add(1, 2));

//for (int i = 0; i < args.length; i++) {

//CLibrary.INSTANCE.printf("Argument %d: %s/n", i, args[i]);

//}

}

}


JNATestDll.java:

package implementation;

import com.sun.jna.Library;

import com.sun.jna.Native;


import test.Dll_Demo;


public interface JNATestDll extends Library {

    JNATestDll instanceDll  = (JNATestDll)Native.loadLibrary("DllDemo1",JNATestDll.class);  

    public int Add(int a,int b);  

    //public int factorial(int n);  

}


注意:

Java Build
Path导入包和把包复制到lib下是有区别的
,它俩其实不会冲突,也没有什么关系的,Java Build
Path是我们编译需要的包,在比如在import ***.***.***时如果没用java Build
Path导入包的话类里面就有红叉,说不识别这个类;

导入到lib下是程序运行时需要的包,即便用Java Build Path导入过的包,没放到lib下,运行项目时会出现ClassNotFoundException的异常. 

在buildpath里面添加jar,注意路径必须是本地“/../..."

参考的博文:
①vs开发dll(dll意义、使用、函数导出方式):http://www.jellythink.com/archives/111
②vs编写动态链接库详细步骤:http://blog.csdn.net/sunxiaoju/article/details/51175505
③Java调用dll文件两种方法(jna、jnative):http://www.cnblogs.com/huozhong/p/5830485.html

PS:还是集成开发环境强大啊啊啊,纠结了一个小时的命令行,换eclipse十几分钟搞定!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: