在Java中调用C++函数

在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/37904933

Clion生成动态链接库.dll
https://blog.csdn.net/superSmart_Dong/article/details/99686497

windows下cmake生成动态链接库dll
https://www.jianshu.com/p/06d519f544e7

https://blog.csdn.net/qq_33414271/article/details/79534763

IntelliJ idea 2018 平台下JNI编程调用C++算法(一)
https://blog.csdn.net/wsxzhbzl/article/details/82727034

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值