4

java上位机开发(c库调用)

 1 year ago
source link: https://blog.csdn.net/feixiaoxing/article/details/125705854
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

java上位机开发(c库调用)

嵌入式-老费 已于 2022-07-10 15:22:53 修改 40

 【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        所有的动态语言,包括在java在内,一般都会提供一个调用c库的方法。java语言的出现是在上个世纪90年代,而c/c++出现的时间要更早一点,大约提前了20多年,所以在这过程当中积累了很多的资源可以调用。此外,由于c/c++可以直接控制硬件,可以直接加速算法的执行,所以作为上位机开发的同学来说,掌握好c库调用也是很有必要的。

e62a22ac4d7444c3b7dffd50a954bdb7.png

         c库调用的方法很多,比较常用的就是jni。jvm作为java虚拟机,调用class字节码,这个大家都了解。那字节码如果需要调用c库,一般会在java代码中有一个显示调用的过程,关键字是native。注意native是函数的名字,不是动态库的名字,动态库的名字一般用System.LoadLibrary来完成,也就是上述图中蓝色的部分。对于简单的动态库,只需要在浅绿色中实现即可。而对于opencv、pcl点云、ffmpeg、jpeg、png这样成熟的动态库来说,浅绿色的部分就是一个翻译的过程,库本身还是原来黄色的部分。这就是绿色和黄色两个模块的区别。下面举例说明,

1、假设有一个java文件,需要调用一个显示HelloWorld的c方法,

        代码中需要调用的dll库是HelloWorldImpl,对应的函数是displayHelloWorld。

2、编译HelloWorld.java,直接调用javac命令即可

7cca07def48649448eca8ae91fdc6d70.png

3、生成HelloWorld.h文件,直接调用javah命令即可

2ee3cae6a4b54f7b8c6a79393ccb97b8.png

4、准备编译dll,可以通过CMake来完成,准备CMakeLists.txt和HelloWorldImpl.cpp文件

        HelloWorldImpl.cpp代码如下所示,

5、通过CMakeLists.txt构建solution文件,编译solution

df18c7a7bd8040a7b3b1e9e804c555ad.png

6、编译dll,应该会出现找不到jni.h的情形,注意添加编译头文件的位置

c2a823d8f5644f938d98a52a3e98c8ea.png

        添加的两个头文件目录是,

7、重新编译dll,不出意外应该可以生成dll文件

a1b16bd27f0148d9b3193c04c82b4878.png

8、将HelloWorldImpl.dll拷贝到顶层,执行java程序,查看是否可以运行通过

b1d0eaf23e30447a8060eadec6427d56.png

        不管是java,还是js、go、python、perl、rust这些语言,都会有调用c库的方法。在实际开发中可以借助于这些方法,不需要重新造轮子就可以实现原来语言没有的功能,而不是在网上不停地去找代码、找方案。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK