欢迎光临散文网 会员登陆 & 注册

JNA技术的简单流程_C++方面

2022-07-30 15:53 作者:DiLinging  | 我要投稿

1 打开IDE

在桌面上或开始菜单中进行搜索,点击

打开C++ IDE

2新建项目

点击

选择 创建新项目

3新建项目

若没有请在上方条形搜索框中进行搜索

选择 具有导出项的(DLL)动态链接库 并点击 下一步,更改项目名(以下记为$N,以$N指代此处您创建的工程名,但请不要用$N作为工程名),点击创建,记下您工程的位置

4:检查先决条件

检查界面中是否有解决方案资源管理器,没有则在上方 视图(V) 选项卡下 选择 解决方案资源管理器(P)

如图第一项

4 打开 源文件

打开解决方案资源管理器中的 源文件 选项卡左侧的三角形,

如图,点击红色框中三角形,使其成为 ▽ 状图形

下方会显示三个后缀为.cpp的文件

图中未显示部分为工程名,本篇中也记为$N

5打开文本编辑器,准备编辑$N.cpp

双击$N.cpp文件并打开

双击此处名为$N.cpp的源文件,位于第四步图中位置

可以看见打开了文本编辑器

遮挡部分为$N

6在示例函数下方编写需要导出的函数    

如图红色框内

首先声明函数,仿照上方 $N_API 返回值类型 函数名(参数列表){

            函数的具体实现

             return 返回值;
          }

返回值类型- C++中的数据类型,如int,bool等基本数据类型和 string等其他数据类型

函数名 一个符合标准的名字(见下),最好能表明函数用途

参数列表 包含 数据类型 变量名 , ..数据类型 变量名 , ....... 调用的时候需要指定这一数据的值,交给函数体处理.也就是 输入 的值

返回值 最后交给函数调用者的数据


如,在$N为DLL的源文件中,编写一个求和函数,函数名为sum,参数列表int a 和 intt b ,返回值类型也为int,则应当如下

函数具体实现即函数体可以省略,但其他部分不可省略

此函数包含了 声明 DLL_APIint sum(int a,int b);两部分和对它的定义两部分

注意:请正确拼写函数名,请不要使用非ASCII字符来命名函数,请使用大驼峰(从第一个有效单词开始,首字母 大写 不大写 大写...),或小驼峰(同大驼峰,但首字母为 小写 大写 小写...)命名较长的函数. 

注意为了JNA技术的另一头 Java ,您可能还需要查阅 JNA中 C++和Java的数据类型映射表

来减少复杂类型的使用,用更简便的返回值和参数类型;最好为基本数据类型,避免不必要的麻烦

注意 在实际工作中,将"函数值"(即运算后得到的结果)打印的意义是不大的,原因如下

1:平常使用的cout(C++),System.out.println(Java)中,其实占用较多资源

2:只打印不返回,相当于连贯的程序在此 断了 ,下方程序无法知晓"运算"结果(返回值)

3:一般习惯将内容打印到日志,而不是使用控制台输出,这样做对debug有意义,但不大,缺少日志那样的严格体系.

注意 请使用具体的数据类型 返回值类型 函数体 函数名等来替换上述和下述格式中的中文

因此,您应当将结果作为返回值进行返回,以此完成 C++和Java的混合编程

7 打开头文件

选择 头文件选项卡左侧的三角形,并且单击此处

单击红色框内三角形使其呈现 ▽ 样式

可以看见下方展开的三个.h头文件

三个头文件

双击$N.h头文件进入文本编辑器界面

如图,$N为 DLL

8:编写头文件

找到头文件文本的最后一行

如图红框所在行

单击并编写文本,格式为

extern "C" $N_API 返回值类型 函数名(参数列表);

(注:如 extern "C" DLL_API int sum(int a,int b); 条件在第五步中.)

您发现了吗,在 extern "C" 后方的内容和函数声明是完全一致的,您只需要将您已经在$N.cpp中写好的函数的定义复制到此处,并加上分号即可

(extern "C"  的作用 表明此函数在连接时按照C语言标准,而不是C++标准,解决函数意外重载和标准不同等问题)

如上述的sum函数应当写

声明函数导出

完成后,您就可以选择上方选项卡中的 生成(B) ,选择 生成解决方案(B) 并单击了

稍作等待,如下方提示有错误,请仔细检查是否有遗漏和其他错误.若显示

则可以关闭IDE,找到此处

位于工程文件夹中

双击 ”x64“ 文件夹

双击此处

双击”Debug“文件夹

双击此处

然后找到后缀为.dll的动态链接库文件即为 JNA技术所需的 C++代码


JNA技术的简单流程_C++方面的评论 (共 条)

分享到微博请遵守国家法律