【混合编程jni】之第三篇 c++ 项目的创建,clion ,一些问题点

1,146 阅读3分钟

“持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

讲了一些Java侧的基础知识,但是还没有讲C++侧的,

毕竟做JNI 开发很少说是不参与c++ 的开发,比如我这次要做的项目

就是包装别的组给的动态库,所以还是要会C++的开发

clion 的安装

IDE的选择

IDE的选择常规来说是用Visual studio ,之前做C++的时候也是用这个,选择idea 有三个原因

安装文件实在有点大,下载麻烦 在vscode和clion 之间做选择,vscode不熟悉,放弃 一直都在用idea,对于idea 熟悉,所以果断选择clion 安装过程这里就不赘述了,只要一步一步的安装就行了

编译库的安装 这个理选择MinGW,MinGW 就是 GCC 的 Windows 版本

下载地址:Downloads - MinGW-w64

根据你的电脑平台,选择对应的版本,一步一步安装就可以了

如果你下载的绿色版本也不无所谓,等下配置就行了

clion的配置

settings ->build -> tools

选择增加一个编译器,找你的安装地址就可以了

image.png

动态链接库的创建

动态库和静态库的区别

静态库 在被其他程序引用的时候,会直接打包进exe,相当于直接包含进去,静态库以后缀为”.a”,库类型为static

动态库 在运行的时候才会调用库,和使用者是分开的,在win下为.dll ,在linux 下为so,库类型为shared

这里选择shared

image.png

点击next 等待clion 创建项目

image.png

编译后会生成一个cmake-build-debug 的文件夹,这个文件夹是cmake的文件夹,

生成的动态库也会在这里

修改自动生成的hello 函数为下面

#ifndef TETT_LIBRARY_H
#define TETT_LIBRARY_H
 
extern "C" void hello();
 
#endif //TETT_LIBRARY_H

再次编译后生成了dll ,这个就是你要的动态链接库

extern C extern 是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用

extern "C"的设立动机是实现C++与C及其它语言的混合编程。 C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同

C ++编译器不能仅仅使用函数名作为唯一的id来链接,所以通过添加关于参数的信息来破坏名称

查看暴露的接口

给的动态链接库可能因为写错了没有暴露函数,怎么确认函数暴露出来呐、?

Linux 下

nm命令(查看库中函数等)查看so接口信息

nm -D libtestJna.so window下

需要你安装visual studio,或者下载dumpbin.exe

切换到dumpbin 所在的目录执行

.\dumpbin.exe /exports D:\clion\tett\cmake-build-debug\tett.dll 看下图

image.png

总结: 这篇主要是讲一下动态链接库的创建

并没有涉及C/C++ 的相关的知识点

最后还讲了extern "C" 和两种观察动态库的函数方法