Java JNI:Native 方法调用 C++ 程序

Java如何用Java Native Interface(JNI)技术调用C++动态链接库dll全过程 要想构建出dll并供Java调用有以下几个步骤: 1.编写Java代码并声明native方法接口 2.将有native方法声明的Java类编译为c++中的头文件 3.创建c++动态链接库工程并导入上一步的头文件 4.实现头文件中的内容,build工程 5.将生成的dll文件拷贝到Java项目下,即可运行Java程序并调用dll 阅读详情

真机环境是 MacOS Big Sur 11.6.4

一、Java 代码编写、编译

  • 首先把代码先编写完成
package top.acware.test;

public class HelloCpp {

    public native void SayHello();

}
  • 编写完成之后需要对代码进行编译,在 Idea 下直接打开命令行
    • Win 环境的可以使用 Cmd 命令

在这里插入图片描述

  • 执行命令:javac HelloCpp.java -h .
    • 注意后面的 ‘.’ 是将编译后的文件放到当前路径下,可以修改到自己合适的位置
    • 在项目下我会创建一个 lib 存放编译好的 .dll 文件,jni 存放编译出来的 .h 文件
  • 编译完之后
    • class 文件对目前来说没什么用,可以删除掉,把 .h 文件移到 jni 下
      在这里插入图片描述

二、C++ 代码编写、环境配置、dll 编译

  • 这里需要用到 Java 的 jni.h 和 jni_md.h,我把他们复制到 jni 目录下
    • 在 $JAVA_HOME/include 里有 jni.h,$JAVA_HOME/include/darwin 有 jni_md.h
      • Win 环境下应该是 $JAVA_HOME/include/win32 目录下有 jni_md.h

在这里插入图片描述

  • 编写 C++ 代码
    • 复制编译出来的 .h 文件,放到 lib 下修改后缀名为 .cpp
#include <jni.h>
#include <iostream>
#include <top_acware_test_HelloCpp.h>
using namespace std;

JNIEXPORT void JNICALL Java_top_acware_test_HelloCpp_SayHello
  (JNIEnv *, jobject){
    cout<<"CPP Say: Hello!"<<endl;
  }

在这里插入图片描述

  • dll 编译
    • 同样的方式打开 Idea 的命令行(.cpp 文件下的路径),输入命令进行编译
    • clang++ -I …/jni -shared -o top_acware_test_HelloCpp.dll top_acware_test_HelloCpp.cpp
      • -I 是指定头文件在哪
      • 我的 Mac 环境安装的是 clang++,也可以使用 gcc,只需要把 clang++ 改成 gcc 即可,命令是一样的

三、加载 dll 文件、运行程序

  • 修改 Java 代码进行加载 dll 文件,然后运行即可
    • 加载的位置看具体情况而定,不止这一种方法
      在这里插入图片描述
Java 调用 Cpp 代码简单示例 前言:首先说明一下,本篇文章是干嘛的,简单来说就是在 Java 代码里调用 C++ 代码。但是呢,这里只做一个简单的示例,调用最简单的 C++ 代码,起到一个抛砖引玉的作用。如有不对之处,望大家指正之。 阅读详情

相关推荐

JNI实现Java调用C++程序(Linux 64位)

简介使用Java通过JNI方式调用C++动态库文件 gcc 4.8.5 centos7 jdk 1.8.0生成C++头文件写一个native方法,testString,作为Java程序中调用的函数,并生成C++头文件.JNIDemo.java:public class JNIDemo { static{ System.load("/root/wo

Wang_Xin_SH的博客 4355

Window上Java通过jni调用C++入门尝鲜

window平台jni调用C程序

sinat_31425585的博客 850

英飞凌 AURIX Development Studio工程移植到Hightec的方法

1. 软件简介 AURIX™ Development Studio是英飞凌针对AURIX TC2XX/TC3XX系列单片机推出了一款免费的软件,集成了iLLD库,内置Tasking compiler和Tasking Debugger,但这两个模块只能用于非商业用途,可供学习和试用。iLLD库是英飞凌为TC2XX和TC3XX Tricore系列单片机提供的底层驱动库,有完善的使用手册,和较好的移植性。 Hightec是一款可以用来开发Aurix系列单片机的编译器,有免费版,可商用,集成GCC编译器,可用UDE

weixin_42967006的博客 7134

详解Java中native方法的使用

如果在指定的目录中找不到实现文件,或者在该文件和后续的包含文件中找不到实现代码,将返回编译错误。而且,比如我在aaa.h中定义了一个函数的声明,然后我在aaa.h的同一个目录下建立了aaa.c,在aaa.c中定义了这个函数的实现,然后#在。原生方法是一种java方法,它的实现是由非java语言(如c)实现的。关于在Java中使用本机方法的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。Native用于java与其他语言(如C)的协作,即native之后的函数实现不是用java写的。

fmz2222的博客 2920

演化计算(蚁群算法、粒子群算法、遗传算法、演化规则......)

演化算法1.概念2.解决的问题 1.概念 传统算法(如梯度下降法、爬山法)根据导数的性质决定迭代的方向;而演化计算是一组解在一起协同作用产生一个最优解。 2.解决的问题 预测优化:演化计算(蚁群算法、粒子群算法、遗传算法等) 解的聚散、多样性:通过多次聚散,尽快得出最优解(某个解不合要求,要能够发散出去) ...

dear_jing的博客 4162

ESP32-P4开发板实战:从零配置VSCode环境到点亮MIPI-DSI屏幕(避坑指南)

本文详细介绍了ESP32-P4开发板在VSCode环境下的配置流程,包括SDK安装、idf_component.yml依赖管理,以及MIPI-DSI屏幕驱动的实现方法。通过实战指南帮助开发者避开常见配置陷阱,快速完成从环境搭建到屏幕点亮的全流程,适用于物联网和嵌入式开发场景。

pp12345的博客 740

【Java高级】在Java中运行C++代码的七大步骤(native 方法)

本文是Java高级的第一篇:通过 Native method(本地方法)来通过 Java 运行 C++代码

m0_57265007的博客 4611

安路科技FPSoC开发实战:从芯片特性到边缘计算应用

本文深入解析安路科技FPSoC芯片在边缘计算领域的开发实战,重点介绍SALDRAGON系列芯片的异构计算架构优势,包括RISC-V/ARM处理器与FPGA的协同工作。通过工业控制和智能视觉应用案例,展示硬件加速实现与低功耗设计技巧,帮助开发者高效利用FPSoC进行边缘计算应用开发。

weixin_29248611的博客 375

java调用C/C++写的dll

Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性。Java调用C/C++写好的DLL库时,由于基本数据类型不同、使用字节序列可能有差异,所以在参数传递过程中容易出现问题,DLL中可能需要做相应的转换。使用Java调用DLL动态链接库的方案通常有三种:JNI, Jawin, Jacob. 其JNI(Java Nati

kerry的专栏 7615

激光定位算法竞技场:hdl_localization与Cartographer/AMCL的横向技术解剖

本文深入对比了hdl_localization、Cartographer和AMCL三种激光定位算法的技术原理与性能表现。通过UKF-NDT融合、图优化和粒子滤波等核心技术,分析了各算法在结构化环境、动态环境和大尺度场景下的适应性。实验数据表明,Cartographer在全局一致性上表现最优,而AMCL在动态环境中更具鲁棒性。文章还提供了算法选型指南和参数调优技巧,为工程实践提供参考。

weixin_29062865的博客 365

【Anaconda】解决“libGL error: MESA-LOADER: failed to open iris”问题

stackoverflow中的“libGL error: MESA-LOADER: failed to open iris”问题。而在自己创建的conda环境中的lib下出现`GLIBCXX_3.4.30’ not found 的情况。在上述解决方案中,将第一行命令的lib路径换成自己创建的conda环境lib路径,运行指令,问题解决。目前问题解决,总结一下查找资料以及解决方法。运行如下命令,发现本地支持。

quintus0505的博客 5023

Java通过JNI调用C++的DLL库

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33697898的博客 93

【深度学习驱动流体力学】采集OpenFOAM仿真数据作为AI模型训练数据集与卷积神经网络搭建到预测(一站式完整代码实现)

采集OpenFOAM仿真数据作为AI模型训练数据集与卷积神经网络搭建到预测(一站式完整代码实现)

源代码杀手的博客 1414

jni java native interface,JNI (Java Native Interface)是什么

一、JNI(Java Native Interface)的设计目的·The standard Java class library may not support the platform-dependent features needed by your application.·You may already have a library or application written in a...

weixin_39932939的博客 90

让 RAP 弹窗参数真正变成必填:Excel Upload Action 的两种实现路径

摘要 在RAP应用中,action弹窗参数经常缺乏必填校验,导致用户体验差。本文提出两种解决方案:1)在action实现中手动校验,简单但交互不流畅;2)通过root abstract entity和abstract BDEF建模,利用field(mandatory)实现框架级校验,推荐此长期方案。后者将约束集中到模型层,使UI与执行期校验一致,特别适合ABAP Cloud环境。以Excel导入为例,强制填写备注和明确选择试运行,可避免审计问题,提升系统可靠性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 197

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JAVA通过jni调用C++

JAVA通过jni调用C++ 创建Java文件 public class HelloJni { native void hello(); static { System.loadLibrary("Hello"); } public static void main(String args[]) { Hello...

悠悠我心2018 319

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JNI(1) 在java中调用本地c++代码

公司项目一直存在效率问题,准备试试用c++动态链接库,实现计算量最大的一部分。 jni----java本地调用。 步骤: 1.写java类,在需要在外部实现的方法前用native修饰,只用声明,不实现。 2.在java项目bin目录下,用javah -jni 类路径+类名    生成c++用的  test.h头文件 3.编写c++. 需include  jni.h 和 jni_md.h,

end's coding life 1085

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java使用JNI调用dll

 一个Java程序调用固有方法,1,第一步是写出对固有方法及它的自变量进行声明的Java代码:    class ShowMsgBox { public static void main(String [] args) { ShowMsgBox app = new ShowMs

从1到无穷大 3464

JNI学习系列——java中调用C/C++

java中调用C/C++ 对JNI的初步认识请看上篇JNI学习系列——初步认识JNI,本编将介绍怎样编写一个简单的JAVA程序来调用C\C++; 1. 编写带有native声明的方法的java类 TestNative.java package com.yin.jni; public class TestNative { //native关键字 声明本地化方法,不需要用JAVA代码具体...

Hunter 134

Java使用JNI调用VC的DLL的一个小例子

一个Java程序调用固有方法, 1,第一步是写出对固有方法及它的自变量进行声明的Java代码: class ShowMsgBox { public static void main(String [] args) { ShowMsgBox app = new ShowMsg...

weixin_30343157的博客 157

浅谈JNI的使用-java调用动态链接库

什么是JNI?Java Native Interface(Java本地接口)的简写。使用这个接口,可以轻松实现java对动态链接库(Dynamic Link Library(.dll/.so)文件的调用,以实现工程存在的一些C/C++的功能。本文主要结合vc++6.0与java编程。   一、建立java文件,文件名称为javacall.java 注意点:1、要对dll里面的方法做本地声明

它山之石,可以攻玉 1390

JNI编程新手入门:Java和C++的超简单交互

系统环境 Mac OS X Yosemite 10.10.5 java version "1.8.0_51" 摘要 简单介绍什么是JNI(Java Native Interface)。通过一个 HelloWorld 小程序,实现通过 Java 调用 C++ 打印 “ Hello Wolrd ” 。 什么是JNI 在编程领域, JNI (Java Native Interface,Java本地接口...

weixin_33722405的博客 152

java——JNI(例子控制台(64位)清屏

因为java的最底层是jvm,所以单纯的控制台java程序不能感知jvm再下面的操作系统的情况, 可以通过JNI(Java Native Interface)技术实现java后台调用C++/C的dll(Dynamic Linkable Library,动态链接库)文件。 不过,对Java外部的调用通常不能移植到其他平台,在applet中还可能引发安全异常。实现本地代码将使您的Java应用程...

weixin_34019929的博客 133

jni c++ dll java

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34150503的博客 80

Java中的native方法

Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。   可以将native方法比作Java程序同C程序的接口,其实现步骤:   1、在Java中声明native()方法,然后编译;   2、用javah产生一个.h文件;

alongwilliam的专栏 513
上一篇: 小知识点:Docker 安装、命令、Dockerfile ...
下一篇: Spark 调优:数据倾斜解决方案、Shuffle、Stage
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值