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++文件 的相关文章

随机推荐

  • 性能指标有哪些

    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