JNI学习之java 调用C/C++本地库

使用Java调用C/C++ 文章目录前言JNI概述例子编写Java代码编译生成的class文件:JNITest.class在命令行下使用javah生成C/C++头文件。在工程的bin目录下输入以下命令:实现C++代码。在VS2008中创建一个Win32 project,类型为DLL。构建C++项目将dll文件复制到Java工程的bin目录下 前言 我们知道Java是一种平台无关性的语言,平台对于上层的java代码来说是透明的... 阅读详情

JNI

什么是JNI?

Java Native Interface
Java本地接口

JNI能做什么?

开发JNI程序会受到系统环境的限制,因为用C/C++语言写出来的代码或模块,编译过程当中要依赖当前操作系统环境所提供的一些库函数,并和本地库链接在一起。而且编译后生成的二进制代码只能在本地操作系统环境下运行,因为不同的操作系统环境,有自己的本地库和CPU指令集,而且各个平台对标准C/C++的规范和标准库函数实现方式也有所区别。这就造成使用了JNI接口的JAVA程序,不再像以前那样自由的跨平台。如果要实现跨平台,就必须将本地代码在不同的操作系统平台下编译出相应的动态库。


Demo流程(OS X下)

一 编写声明了native关键字的java类,保存于HelloWorld.java

  1. 在本地创建一个文件夹jnitest
  2. jnitest文件夹下创建HelloWorld.java;
  3. HelloWorld.java代码如下:
package com.study.jnilearn;

public class HelloWorld{
    public static native String sayHello(String name);
    public static void main(String[] args){
        System.loadLibrary("HelloWorld");
        String text = sayHello("HelloWorld!");
        System.out.println(text);
    }
}

二 使用javac将HelloWorld.java源代码编译成HelloWorld.class字节码文件

1.在jnitest下创建一个bin文件夹
2.使用 javac 将 HelloWorld.java 源代码编译成 HelloWorld.class 字节码文件

javac HelloWorld.java -d bin

3.这样会在bin文件夹下生成对于的class文件,其路径为bin/com/study/jnilearn/HelloWorld.class


三 将使用javah生成对应的头文件HelloWorld.h

javah -jni -classpath bin -o HelloWorld.h com.study.jnilearn.HelloWorld

这会在jnitest文件夹下生成HelloWorld.h文件


四 创建HelloWorld.c文件,并实现里面的native方法

在HelloWorld.h的同级目录下新建一个HelloWorld.c文件,实现native声明的方法

#include "HelloWorld.h"

#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_study_jnilearn_HelloWorld
 * Method:    sayHello
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_study_jnilearn_HelloWorld_sayHello
  (JNIEnv *env, jclass cls, jstring j_str){
        const char *c_str = NULL;
        char buff[128] = {0};
        c_str = (*env)->GetStringUTFChars(env, j_str, NULL);
        if (c_str == NULL){
            printf("out of memory.\n");
            return NULL;
        }
        (*env)->ReleaseStringUTFChars(env, j_str, c_str);
        printf("C Str:%s\n", c_str);
        sprintf(buff, "%s", c_str);
        return (*env)->NewStringUTF(env, buff);
  }

#ifdef __cplusplus
}
#endif

五 编译C代码,生成本地库

gcc -dynamiclib -o libHelloWorld.jnilib HelloWorld.c -framework JavaVM -I$JAVA_HOME/include -I/$JAVA_HOME/include/darwin

这样会在jnitest文件夹下生成libHelloWorld.jnilib


六 运行java程序

java -classpath bin com.study.jnilearn.HelloWorld

输出:

C Str:HelloWorld!
HelloWorld!

c++代码生成动态库的不同之处

1.新建cpp文件,对于JNIEnv *env的调用是不同的

#include "HelloWorld.h"

extern "C" {
/*
 * Class:     com_study_jnilearn_HelloWorld
 * Method:    sayHello
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_study_jnilearn_HelloWorld_sayHello
  (JNIEnv *env, jclass cls, jstring j_str){
        const char *c_str = NULL;
        char buff[128] = {0};
        c_str = env->GetStringUTFChars( j_str, NULL);
        if (c_str == NULL){
            printf("out of memory.\n");
            return NULL;
        }
        env->ReleaseStringUTFChars(j_str, c_str);
        printf("C Str:%s\n", c_str);
        sprintf(buff, "%s", c_str);
        return env->NewStringUTF(buff);
  }
}

2.生成动态库的源文件是不同的

gcc -dynamiclib -o libHelloWorld.jnilib HelloWorld.cpp -framework JavaVM -I$JAVA_HOME/include -I/$JAVA_HOME/include/darwin
Java学习之通过JNI调用C/C++编写的dll链接库(图文教程) 看了网上几个主要的教程,都会导致出现各种错误,对于初学者来说会造成一些困扰。在这里详细记录一下JNI调用过程。本案例的基本配置:Eclipse+VS2015,Win10  64位 (1)编写Java Project 打开Eclipse,新建一个Java Project,如:LearnJNI。新建包名,如:com.cogito。新建一个类TestNative。 编写代码,如下: pack 阅读详情

相关推荐

android实现app通过jni调用C/C++方法

本文实现在android app中使用调用jni库调用本地C/C++方法。 1.新建android工程 2.新建java上层方法 本例子在工程中新建 cn.landsem.jnistudy 包,在其中新建TestManager类用于调用本地C/C++方法,该类的代码如下: package cn.landsem.jnistudy; import android.util.Log; pub

三言两语 1万+

JNI初步(五)jni ndk 一个.so文件依赖另一个.so文件的写法

jin 的步骤首先参考https://blog.youkuaiyun.com/we1less/article/details/108930467 注意:本文是在ndk环境下编写 1.写native类声明native方法 package com.godv.audiosuc; public class NativePlayers { static{ System.loadLibrary("JNI_ANDROID_AUDIOS"); System.loadLibrary("J

we1less的博客 5097

Java通过JNI调用C/C++函数

在某些情况下,Java语言需要通过调用C/C++函数来实现某些功能,因为Java有时候对这些功能显的无能为力,如想使用X86_64 的 SIMD 指令提升一下业务方法中关键代码的性能,又或者想要获取某个体系架构或者操作系统特有功能的支持。为了能在Java 代码中调用 C/C++函数,JVM提供了Java Native Interface(JNI)机制。 在Java中,使用native关键字标注的、没有方法体的方法就是native方法。当在 Java 代码中调用这些 native 方法时,Java 虚拟机将通

weixin_54305824的博客 1183

java jni 缺少依赖库,如何在JNI项目中修复UnsatisfiedLinkError(无法找到依赖库)

I'm working on a Java project that uses the JNI. The JNI calls a custom library that I've written myself, let's say mylib.dll, and that depends on a 3rd party library, libsndfile-1.dll.When I run my ...

weixin_31238109的博客 444

使用JNI技术实现Java和C/C++互调(Java调C/C++)

Java作为一个技术生态平台在业界得到了广泛的应用,许许多多的大型项目都是搭载在其之上。Java语言本身功能也十分强大,能实现大量的业务逻辑算法。那么,我们为什么要让Java和C/C++互调呢,直接用Java写不就完了吗?这是初学者一个很常见的疑问,下面我们来看看为什么需要这样做。     用Java调用底层的代码(不一定指是C/C++写的,虽然大部分是)主要原因有三个:     1.运行效率

wonghifong0223的博客 3341

JAVA JNI 调用C/C++库提高运行效率 (图)

JAVA JNI 调用C/C++库提高运行效率    JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI(Java Native Interface)。    JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是S

史莱姆的专栏 6572

windows java jni_Java JNI和Windows上的依赖库

长故事短:我有一个可执行的jar,它调用依赖于lib.dll的jni.dll.而且我得到了这么糟糕的UnsatisfiedLinkError.This的答案非常接近,但是从我的经验来看,它无法解决问题.即使在java.library.path中指定了dll所在的文件夹,它将无法正常工作.我也必须更改Windows PATH环境变量.实际上,Windows上的默认java.library.path似...

weixin_42463736的博客 278

OpenWRT端口转发与NAT环回冲突的排查与解决

本文详细解析了OpenWRT路由器中端口转发与NAT环回功能冲突导致的内网访问故障。通过生活化类比阐明两者工作原理,提供从基础诊断到内核参数调整、LuCI选项配置及手动编写iptables规则的多套解决方案,并给出进阶排查思路,帮助用户彻底解决内网无法通过公网地址访问服务的常见问题。

weixin_29243279的博客 507

java使用jni依赖包

1.引入依赖 <!-- https://mvnrepository.com/artifact/com.sun.jna/jna --> <dependency> <groupId>com.sun.jna</groupId> <artifactId>jna</artifactId> <version>3.0.9</ver

qq_39432715的博客 1631

数字孪生成熟度的L0-L4五级划分,各自特征和应用场景

数字孪生的分级(或成熟度模型)通常用于描述其技术复杂度和功能完备性的演进过程。3D设计模型(CAD)、建筑信息模型(BIM)、产品数字化手册。全自动驾驶系统、自适应智能电网、 “黑灯工厂”的自主调度。多学科模型融合、 “What-if”分析、提供决策建议。IoT设备监控平台、预测性维护(报警)、智慧仪表盘。工艺仿真优化、资产性能管理、手术方案预演、虚拟调试。状态监控、历史回溯、阈值报警、根因分析。可视化、数字化档案。自优化、自适应、目标驱动、高度自治。传统设备、纸质记录的管理模式。无或仅有离线、孤立数据。

2401_82881178的博客 1553

Python爬虫实战:5分钟抓取东方财富股票数据并保存为CSV

在投资分析与量化研究的日常工作中,获取结构化、可用的金融数据往往是第一步。对于个人投资者和量化入门者而言,如何高效获取A股全市场行情,常常面临网页动态加载、反爬机制与数据整理繁琐等挑战。本文从数据采集的基础概念出发,介绍如何利用Python这一通用编程语言,通过requests库请求财经网站公开的HTTP接口,获取返回的JSON数据,再借助pandas进行字段映射、数据清洗与表格化处理。这种方式相比传统页面解析具有响应快、结构稳定、易于批量操作的显著优势,尤其适合构建个人股票数据池、验证选股策略或进行市场情

weixin_33146151的博客 251

JNI和NDK开发(2)_手动创建带JNI的依赖库

上文讲解了使用Android Studio自动创建和分析一个JNI的简单工程,这篇文章将讲述如何手动配置一个带JNI的依赖库。我们平时写一个工具SDK肯定是要在Module里编写,所以熟练掌握如何手动配置JNI的CMake编译是很有必要的。 本文概览 1、创建Module并配置JNI 2、生成头文件和查看签名 3、JNI中打印日志的使用 4、生成AAR文件和SO库 创建Module并配置JN 1、...

renzhongrui的博客 431

VMware Ubuntu虚拟机突然断网?我用5步彻底解决了(附避坑指南)

Ubuntu虚拟机断网问题通常由网络配置冲突和VMware服务未正确绑定导致。本文提供5步解决方案:1)清理Ubuntu重复有线连接;2)重启Windows主机的VMware服务;3)检查VMware虚拟网络配置;4)重新配置Ubuntu网络参数;5)测试网络连通性。关键避坑点包括:避免多连接共存、修改配置后必重启服务、确保虚拟网卡绑定主机。通过"网卡状态→IP/路由→网关→服务"的排查思路,可快速解决虚拟机网络故障。文末附有详细的故障症状对照表,便于快速定位问题。

m0_58530495的博客 627

Java中调用由C/C++实现的本地库(JNI本地程序调用)

JNI全称叫Java Navtie Interface,中文翻译本地调用。C/C++是系统级的编程语言, 可以用来开发任何和系统相关的程序和类库, 但是Java本身编写底层的应用比较难实现, 使用JNI可以调用现有的本地库, 极大地灵活了Java的开发.C/C++的效率是目前最好的语言, 可以使用C/C++来实现一些实时性非常高的部分. C/C++和Java本身都是非常流行的编程语言, 一些大型软件中经常使用语言之间的混合编程.(在Java中调用C/C++本地库)本地库被分为。

扶摇的博客 1769

更换光猫的原理与方法

当你给装维打电话说你需要更换光猫时,对于装维来说,他并不需要知道怎么更换,他只需要生成一张工单,由后台进行业务操作后,在去用户家把新光猫给装好即可,此时装维到底起到了什么作用呢?我想可能只是运输员吧,把一个设备从一个地方运到另一个地方罢了,此时并不能指望装维做什么,因为本质上来说装维的能力真的很差很差,我是不知道那些装维哪来的勇气做视频,还说自己什么什么能力很强?很强吗?吹牛的技术确实很强。 更换光猫之前,需要先明白为什么要更换光猫,怎么更换光猫,更换后不能用怎么办?怎么才能更换成功,换光猫以后被限速了怎么

qq_34146290的博客 1万+

6、探索音乐结构中的统一性:贝多芬《英雄交响曲》第一乐章的深度剖析

本文深入剖析了贝多芬《英雄交响曲》第一乐章的音乐结构,探讨其统一性的来源及表现形式。通过主题与动机、和声与调性、旋律与节奏、织体与动态等多方面的分析,揭示了这部作品在技术层面和情感表达上的卓越成就。

b9c0d的博客 518

JNI实现Java调用C/C++代码及对C/C++动态库的单步调试

JNI标准作为Java平台的一部分,提供了与编译型语言进行交互的手段,尤其是对C/C++的交互。如果你有一段现成的C/C++代码想在java中调用,就可以通过JNI来完成。 假如有一段C代码,这段代码如下: int say_hello() { printf("Hello world!\n"); return 0; } 如果想在java中实现这段代码的调用,打印出“Hello world!“,该如何做呢?如何实现对C/C++代码实现单步调试呢? 一、新建一个java工程 我使用

zx_glave的博客 5693

企业数字化转型解决方案架构设计:一个五维全景视角

本文系统探讨了企业数字化转型的架构设计框架,提出五维协同模型:企业架构作为战略罗盘,业务架构聚焦价值创造,应用架构实现能力载体,数据架构提供智能燃料,技术架构奠定基础支撑。文章深入分析了各架构域的核心要素、设计原则及相互关系,并指出数字化转型需通过渐进路径,结合战略引领、技术赋能和组织变革,构建有机统一的架构体系。该框架为企业应对数字化复杂性提供了系统性方法论,强调从整体视角实现技术与业务的深度融合。

金牌架构师 1256

Java调用C/C++那些事(JNI)

例子中,创建一个HelloWorld类。本地方法声明,表示该方法的具体实现不在Java代码中,而是在通过System.loadLibrary加载的本地库中实现。定义了四个本地方法,输入和输出都是基本数据类型intstatic{定义了两个方法,一个是输入字符串,一个是输出字符串。static{定义一个对象,表示点,保存坐标x、y,提供get、set方法this.x=x;this.y=y;//get、set、toString方法省略。

weixin_42524843的博客 1645

C#工业通信完整项目实战:从协议解析到数据库存储,打造工业级全链路数据闭环(完整可复用源码)

工业自动化的核心诉求是「数据闭环」:从工业设备采集真实生产数据 → 解析校验获得有效数据 → 持久化存储到数据库形成生产台账 → 数据分析/报表展示/异常预警,形成采集→解析→处理→存储→应用的全链路数据流转,这也是工业上位机开发的终极落地形态,区别于单纯的「数据采集」demo。本次实战是一套工业级完整投产级项目,基于C# WinForm + .NET Framework 4.8(工业标配)✅双通信链路完美适配:同时封装TCP网口 + 串口(RS232/485)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1038

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java JNI调用本地库2(Linux版本)

上面一篇我们介绍了JNI的基本使用,生成的DLL文件为Windows系统上动态连接库文件。但是在linux系统上,库文件分为静态和动态两种:(1)、静态库:静态库(.a 文件),确保链接时指定了静态库文件。(2)、动态库:动态库(.so 文件),确保在运行时库文件在LD_LIBRARY_PATH 中。不论是哪一种库文件(.dll,.so,.a等),都相当于Java的jar包,可以通过JNI方式连接调用其内部的方法。

weisian的博客 2万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

在c/c++中调用Java方法

JNI就是Java Native Interface,既可以实现Java调用本地库, 也可以实现C/C++调用Java代码, 从而实现了两种语言的互通,可以让我们更加灵活的使用。 通过使用JNI可以从一个侧面了解Java内部的一些实现. 本文使用的环境是 64位的win7系统 JDK 1.6.0u30 (32位) C/C++编译器是 Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86 (VC 6.0

顺其自然~专栏 8224

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

在Java中调用C/C++本地库

本文参考:https://www.cnblogs.com/jaejaking/p/6840530.html JNI是Java Native Interface的英文缩写, 中文翻译为本地调用, 自从Java 1.1开始就成为了Java标准的一部分. C/C++是系统级的编程语言, 可以用来开发任何和系统相关的程序和类库, 但是Java本身编写底层的应用比较难实现, 使用JNI可以调用现有的本地库, 极大地灵活了Java的开发. C/C++的效率是目前最好的语言, 可以使用C/C++来实现一些实时性非常

shujuliu818的专栏 1328

JNI: C/C++调用Java方法

C/C++调用Java方法步骤: FindClass: 可以在C/C++层找到Java层的类 GetMethodID/GetFieldID:得到Java层中所有的类/属性 NewObject:创建对象,这个对象就代表内存中一个Java对象。有了这个对象之后,再通过GetMethodID/GetFieldId取到的MethodID(其实它就是个索引值)/FieldID,类中这个方法/属性的索...

手写我对你的温柔 5154

java调用C/C++写的dll

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

kerry的专栏 7619

JNI简单学习(java调用C/C++)

JNI(Java Native Interface)是 JDK 内置的标准原生接口,是 Java 平台与 C/C++ 等原生代码(Native Code)交互的底层规范,允许 Java 虚拟机(JVM)中的 Java 代码调用原生代码,也支持原生代码回调 Java 代码。与 JNA(基于 JNI 封装的上层类库)不同,JNI 是 Java 与原生代码通信的 “底层基础”,所有 Java 调用原生库的方案(包括 JNA、JNR 等)最终都基于 JNI 实现。

qq_64851111的博客 1164
上一篇: [Lua]实现switch的一种方案
下一篇: Unity 之 GameFramework
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值