IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> clion+cmake+MinGW 编写jni -> 正文阅读

[C++知识库]clion+cmake+MinGW 编写jni

安装clion和cmake,MinGW 有32位和64位的,一定要注意位数与jvm匹配,否则会出错。

1.java生成jni的c++头文件

编写一个java类,里面都是native方法

public class HelloApi {
    public native String hello();
    public native void sayHello();
    public native void sayName(String name);
}

通过命令生成JNI的c++头文件(我这里是jdk11)

javac HelloApi -h jni

在这里插入图片描述

2.新建c++项目

直接选择创建library就可以了
在这里插入图片描述
可以把创建项目生成的library.cpplibrary.h文件删除,把刚刚用java命令生成的jni的c++头文件复制到项目中,在创建一个.cpp文件,用来实现jni头文件里面的方法。
在这里插入图片描述

3.修改cmake构建文件(CMakeLists.txt)

主要是吧jni依赖的头文件包含进来。

cmake_minimum_required(VERSION 3.13)
project(jnidll)

set(CMAKE_CXX_STANDARD 14)
include_directories(D:\\soft\\JAVA\\JDK\\include\\win32 D:\\soft\\JAVA\\JDK\\include)
add_library(jnidll SHARED com_wl_HelloApi.cpp com_wl_HelloApi.h)

把jni生成的头文件中的函数实现

#include "com_wl_HelloApi.h"

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>

using namespace std;

JNIEXPORT jstring JNICALL Java_com_wl_HelloApi_hello
        (JNIEnv *env, jobject) {
    const char *strContent = "heelo";
    char str[] = "欢迎你的到来!";
    //字符串拼接,实现strContent+str1,因为strcat的第一个参数必须为非const类型(可变),所以不能直接使用strcat()
    //创建一个新的字符串指针
    char *strTemp = (char *) malloc(strlen(strContent) + strlen(str) + 1);
    //拷贝常量到字符串指针
    strcpy(strTemp, strContent);
    //拼接str1到strTemp
    strcat(strTemp, str);
    //返回一个utf的jstring
    return env->NewStringUTF(strTemp);
}


JNIEXPORT void JNICALL Java_com_wl_HelloApi_sayHello
        (JNIEnv *, jobject) {
    cout << "hello" << endl;

}

JNIEXPORT void JNICALL Java_com_wl_HelloApi_sayName
        (JNIEnv *env, jobject, jstring contentStr) {
    const char *strContent = env->GetStringUTFChars(contentStr, JNI_FALSE);
    cout << strContent << endl;
}

在build这个c++工程
在这里插入图片描述
就会生成.dll文件
在这里插入图片描述
回到java项目,把生成的dll文件可以放到任何位置,把加载dll文件的静态代码块加上。

public class HelloApi {
    static {
        System.load("F:\\intellijide work\\jniTest\\src\\main\\resources\\libjnidll.dll");
    }
    public native String hello();
    public native void sayHello();
    public native void sayName(String name);

}

测试

public class JniDemo {
    public static void main(String[] args) {
        HelloApi helloApi = new HelloApi();
        helloApi.sayHello();
        System.out.println(helloApi.hello());
        helloApi.sayName("jni测试");
    }
}

在这里插入图片描述

加载dll文件的时候可能会出现 Can’t find dependent librarie,这是因为你的电脑中没有必须要的dll文件,可以通过dll依赖分析工具看看缺少了那些dll文件。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-23 10:32:07  更:2021-07-23 10:32:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/29 2:02:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码