在Java中调用C++函数
文章目录
环境的搭建
开发环境为
IDEA
Clion(后改用VS )
预备知识的学习
1 JNI的认识
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)
2.JNI的使用
在学习Java内存模型的时候学习到郭本地方法栈,其中就是存放的native修饰的本地方法,这次就开始学习如何使用这个本地方法
举一个网上的使用本地方法的例子,大致就是在代码块中加载这个C++的头文件和函数文件编译成一个dll文件,使用代码块进行加载,然后使用里面的函数就可以了
public class NativeDemo {
{
/**
* 系统加载其他的语言的函数
*/
System.load("C:\\Users\\Administrator\\Desktop\\com\\Hello.dll");
}
/**
* 就这个natice关键字.标记了这个接口,看起来像是abstract
*/
public native void sayHello();
public static void main(String[] args) {
new NativeDemo().sayHello();
}
}
3.Demo的制作
3.1 创建使用的Java类并进行编译
创建Java使用类
package com.huangzb.demo;
public class MyJNI {
{
System.load("ExampleJNI");//C:\Users\Administrator\Desktop\com\Hello.dll
}
public native void sayHello();
public static void main(String[] args) {
new MyJNI().sayHello();
}
}
使用javac命令编译
E:\home\OpencvJNI\src\com\huangzb\demo>javac MyJNI.java
使用javah命令编译
E:\home\OpencvJNI\src>javah -jni com.huangzb.demo.MyJNI
使用的过程中,不能在Java包下,需要在src目录下使用javah命令,否则找不到
3.2 创建C++函数
正常创建一个Clion的C++项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UAe8JwYP-1584439302020)(en-resource://database/1052:1)]
修改Cmakelist文件中的语句
add_library(MyJni SHARED main.cpp )
#add_executable(MyJni main.cpp)
运行一遍就可以在对应的 cmake-build-debug文件夹下找到自己的dll文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KUjLwEtU-1584439302021)(en-resource://database/1054:1)]
add_library
该指令的主要作用就是将指定的源文件生成链接文件,然后添加到工程中去。
add_executable
使用给定的源文件,为工程引入一个可执行文件。
3.3动态链接库(dll)概述
在实际编程中,我们可以把完成某项功能的函数放在一个动态链接库里,然后提供给其他程序调用。像Windows API中所有的函数都包含在dll中,如Kernel32.dll, User32.dll, GDI32.dll等。那么dll究竟有什么好处呢?
静态库和动态库
静态库:函数和数据被编译进一个二进制文件(扩展名通常为.lib),在使用静态库的情况下,在编译链接可执行文件时,链接器从静态库中复制这些函数和数据,并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.exe)。当发布产品时,只需要发布这个可执行文件,并不需要发布被使用的静态库。
动态库:在使用动态库时,往往提供两个文件:一个引入库(.lib,非必须)和一个.dll文件。这里的引入库和静态库文件虽然扩展名都是.lib,但是有着本质上的区别,对于一个动态链接库来说,其引入库文件包含该动态库导出的函数和变量的符号名,而.dll文件包含该动态库实际的函数和数据。
3.4运行
获取到成功运行的文件有
Java生成的头文件
c++根据头文件生成的dll文件
总的来说步骤是
1.创建.h文件
使用javac和javah命令生成class文件然后生成.h文件
2.创建.dll文件
创建一个c++链接库,将.h文件放在C++的动态链接库中,并将生成的头文件的相关的头文件也复制到c++项目下
写一个函数进行运行,函数的名字和生成的头文件需要对应上
#include "com_huangzb_demo_MyJNI.h"
#include "jni.h"//注意添加这句
#include<iostream>
using namespace std;
JNIEXPORT void JNICALL Java_com_huangzb_demo_MyJNI_hello(JNIEnv* env, jobject obj)
{
cout << "Hello World!" << endl;
cout << "I come from C++!" << endl;
}
然后编译就会在项目下生成dll文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fU5UBOyC-1584439302022)(en-resource://database/1058:0)]
3.加入运行
就将dll放在程序中,点击运行就可以了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UyDuipUK-1584439302024)(en-resource://database/1060:0)]
用javah 导出类的头文件, 常见的错误及正确的使用方法
https://blog.csdn.net/c_guolin/article/details/37904933Clion生成动态链接库.dll
https://blog.csdn.net/superSmart_Dong/article/details/99686497windows下cmake生成动态链接库dll
https://www.jianshu.com/p/06d519f544e7https://blog.csdn.net/qq_33414271/article/details/79534763
IntelliJ idea 2018 平台下JNI编程调用C++算法(一)
https://blog.csdn.net/wsxzhbzl/article/details/82727034