java调用c++文件

2023-11-14

网上有很多例子,参照着执行有时候相对路径问题经常卡住了,实战了一把通过后,特重新整理一份,供小白参考

首先需要有一个含有native方法的java类

vi /Users/mac/work/git/javademo/src/main/java/com/alioo/jni/JniDemo.java

package com.alioo.jni;

public class JniDemo {
    static {
        //System.setProperty("jna.library.path", "/Users/mac/work/git/javademo/target/classes/");
        //System.loadLibrary("libHello.dylib");
        //System.loadLibrary("Hello");


        System.load("/Users/mac/work/git/javademo/target/classes/libHello.dylib");

    }

    public native void printHello();

    public static void main(String[] args) {
        new JniDemo().printHello();
    }
}


编译后对应的class文件如下

/Users/mac/work/git/javademo/target/classes/com/alioo/jni/JniDemo.class

通过javah命令来生成c++的.h文件

cd /Users/mac/work/git/javademo/target/classes
javah -jni com.alioo.jni.JniDemo


正常情况下可以生成如下文件com_alioo_jni_JniDemo.h

more /Users/mac/work/git/javademo/target/classes/com_alioo_jni_JniDemo.h


/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_alioo_jni_JniDemo */

#ifndef _Included_com_alioo_jni_JniDemo
#define _Included_com_alioo_jni_JniDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_alioo_jni_JniDemo
 * Method:    printHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_alioo_jni_JniDemo_printHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


手写c++实现类com_alioo_jni_JniDemo.cpp

备注:实现类com_alioo_jni_JniDemo.cpp跟com_alioo_jni_JniDemo.h在同一个目录里


vi /Users/mac/work/git/javademo/target/classes/com_alioo_jni_JniDemo.cpp

#include <iostream>
#include "com_alioo_jni_JniDemo.h"

JNIEXPORT void JNICALL Java_com_alioo_jni_JniDemo_printHello
  (JNIEnv *, jobject)
{
   printf("Hello, Java world!\n");
   return ;
}
int main(){

    return 1;
}

生成动态链接库

备注:这一步你不能直接复制,需要改成你电脑中实际的jdk的路径

cd /Users/mac/work/git/javademo/target/classes
g++ -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/include/ com_alioo_jni_JniDemo.cpp -o libHello.dylib

可能遇到的错误及解决办法

‘jni.h’ file not found

$ g++ -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/include/ com_alioo_jni_JniDemo.cpp -o libHello.dylib

com_alioo_jni_JniDemo.cpp:1:10: fatal error: 'jni.h' file not found
#include "jni.h"
         ^~~~~~~
1 error generated.

解决办法

$ sudo cp /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/include/darwin/jni_md.h /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/include/

可以看到生成了libHello.dylib


$ ll /Users/mac/work/git/javademo/target/classes
total 56
drwxr-xr-x   9 mac  staff    288 Nov  4 10:55 .
drwxr-xr-x  13 mac  staff    416 Oct 14 20:00 ..
-rw-r--r--   1 mac  staff    658 Oct 14 20:02 A.class
drwxr-xr-x   3 mac  staff     96 Oct 14 16:19 META-INF
drwxr-xr-x   3 mac  staff     96 Oct 14 16:49 com
-rw-r--r--   1 mac  staff    181 Nov  4 10:46 com_alioo_jni_JniDemo.cpp
-rw-r--r--   1 mac  staff    442 Nov  4 10:42 com_alioo_jni_JniDemo.h
drwxr-xr-x   3 mac  staff     96 Oct 14 16:49 java2
-rwxr-xr-x   1 mac  staff  12564 Nov  4 10:55 libHello.dylib

测试一把


$ pwd
/Users/mac/work/git/javademo/target/classes
$ java com.alioo.jni.JniDemo
Hello, Java world!

扩展

当然了,也可以用g++编译成可执行程序,直接执行,但是这个已经与本文主题无关了,有兴趣的也可以试试

cd /Users/mac/work/git/javademo/target/classes
g++ --std=c++11 com_alioo_jni_JniDemo.cpp -I /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/include/

上述命令如果没有报错的情况下会在当前目录中生成一个可执行程序a.out

./a.out 
$ echo $?
 1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java调用c++文件 的相关文章

  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 重载<<的返回值

    include
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 性能指标有哪些

    1 响应时间 Response time 响应时间就是用户感受软件系统为其服务所耗费的时间 对于网站系统来说 响应时间就是从点击了一个页面计时开始 到这个页面完全在浏览器里展现计时结束的这一段时间间隔 看起来很简单 但其实在这段响应时间内
  • 开源GIS浅谈

    开源GIS浅谈 转 http blog csdn net happyduoduo1 article details 51773850 谈到GIS软件 首先让我们想到的是GIS界的龙头大哥ESRI公司旗下的ArcGIS产品 从最初接触的ver
  • js中的微任务和宏任务,附面试题

    因为javascript是一门单线程语言 所以代码的解析执行都要以自上而下的执行 直到任务队列 task queue 的出现 js开始有了异步任务 当一段代码需要稍后执行时 便可以使用异步方案 setTimeout setInterval
  • Eclipse C debug报错Can‘t find a source file at “xxxxx“Locate the file or edit the source lookup path

    笔记备忘 1 操作入下 Debug configerations进入如下界面 双击你的放置器对应的选项 添加新的选项 在source位置记得添加如下选项 2 解决完上面报错还提示如下 no source for main step1 工程右
  • C++构造函数的各种用法全面解析(C++初学面向对象编程)

    文章目录 一 构造函数的基本用法 二 带参构造函数与其调用 三 拷贝构造函数 四 构造函数的重载 一 构造函数的基本用法 1 构造函数概念 一个类的对象被创建的时候 编译系统对象分配内存空间 并自动调用该构造函数 由构造函数完成成员的初始化
  • 解决:如何将pytorch的版本改为和cuda对应、如何使用笔记本电脑自带的NVIDIA使用GPU跑深度学习

    Step1 安装cuda 网址 https developer nvidia com cuda toolkit archive PS 此处必须先看看电脑显卡是否自己就装了cuda 可以通过执行命令行语句nvcc V以此检查cuda是否有 如
  • 字典表设计

    为什么字典表 存在问题 某些变量在多个地方使用 而且一般是固定的 但是随着系统升级和后期变化 可能需要改变 如果这些变量写死在代码里面将会变得难以维护 所以要将其从代码中抽离出来 一般的业务系统客户端与用户交互的时候都会使用下拉框组件 对于
  • Kafka3.0.0版本——消费者(分区的分配以及再平衡)

    目录 一 分区的分配以及再平衡 1 1 消费者分区及消费者组的概述 1 2 如何确定哪个consumer来消费哪个partition的数据 1 3 消费者分区分配策略 一 分区的分配以及再平衡 1 1 消费者分区及消费者组的概述 一个con
  • 样本的均值和方差的无偏估计与测试阶段均值方差的关系

    什么是无偏估计 估计是用样本统计量 可以理解为随机抽样 来估计总体参数时的一种无偏推断 无偏估计的要求就是 估计出来的参数的数学期望等于被估计参数的真实值 所以呢 可以看出 估计值也是一个变量 因为是随机的嘛 真实值谁也不知道啊 因为你不可
  • 数据隐藏之Qt中d指针详解

    最近看到代码有用到了Qt中的Q D指针 就去学习了下 发现真的很好用 因此写一篇文章总结下 student h class CStudent public CStudent CStudent private string m name in
  • LeetCode 1. 两数之和

    题目链接 https leetcode cn problems two sum 思路如下 从前往后遍历 n u m s nums
  • 分销系统开发 分销商城开发 分销功能 Java开发"三级分销"业务功能

    众所周知 互联网时代 分享经济现在随处可见 各行各业都有各种分销系统 最为常见的就是三级分销 那么如何实现这个业务功能了 笔者通过本篇图文案例给大家分享一下实现过程 此处以二级分级分销实现为例 1 什么是二级分销 二级分销其实是一种让用户分
  • 【面试】赢时胜和花旗

    一 赢时胜 1 springmvc的底层 DispatcherServlet gt HandlerMaping gt Handler gt HandlerAda 2 spring注入的方式 spring循环依赖 注解是否解决了循环依赖 3
  • 从setContentView到onResume应用显示过程分析

    之前总体笼统地分析了Acitivity从启动到显示的过程 Activty启动到显示的过程 一 Activty启动到显示的过程 二 发现很多细节没有注意到 后续挑些过程中比较重要的部分重点分析 在上一篇文章分析了一个app从zygote到on
  • 惠普笔记本的Windows10和Ubuntu20.04双系统安装教程

    Windows10和Ubuntu20 04双系统安装教程 1 下载Ubuntu系统镜像到D盘 2 下载安装镜像工具到D盘 3 制作Ubuntu的系统安装盘 4 磁盘分区 5 GPT分区安装Ubuntu 6 结语 7 参考资料 惠普暗影精灵使
  • Python+selenium模块爬虫实战---拉勾网

    Python selenium模块爬虫实战 拉勾网 一 项目需求 二 selenium概述 三 爬虫思路 四 代码实现 五 完整代码 一 项目需求 项目需求 实现一个可以自动获取拉钩网 自定义搜索 的岗位招聘信息的爬虫程序 实现工具 Pyc
  • 【Unity InputSystem】基础教程(保姆级超详细超基础!!!)

    InputSystem基础教程 1 基础概念 1 1 前言 2 基础操作 2 1插件安装 2 2 如何创建InputActions 2 3 InputActions概念及结构关系 ActionMaps Actions ActionPrope
  • Disentangled Representation:IVIF

    DRF Disentangled Representation for Visible and Infrared Image Fusion DRF 可见光和红外图像融合的解纠缠表示 在本文中 我们通过将 解纠缠表示 应用于可见光和红外图像融
  • ssh登录一直提示修改密码解决

    用SSH登录就会出现用户登录失败 提示诸如 WARNING Your password has expired You must change your password now and login again 等等 在开发板手工修改 大致
  • java调用c++文件

    网上有很多例子 参照着执行有时候相对路径问题经常卡住了 实战了一把通过后 特重新整理一份 供小白参考 首先需要有一个含有native方法的java类 vi Users mac work git javademo src main java