JNI编写详细步骤实践,javac编译,gcc编译

教程 | 入门纯手写JNI编译与使用(适合做demo) 前言 做开发的,喜欢看源码的同学,肯定会遇到native关键词,接着就会卡在这里进行不下去,因为native对应的代码就是C了,如果要看再底层的代码,就之只能上官网要C层面的代码了。 2年前,笔者开发过JNI(Java Native Interface),java和C都要实现,这里拿出了笔者多年前的笔记,加点润色说明(貌似也没润多少),希望对大家有所帮助。 目标: 理解native是什么? 自己如何实现jni调用? 了解什么是native 我们在学习JVM运行数据区的时候,会了解到虚拟机栈和本地方法栈, 阅读详情

简介:

最近,使用native进行开发的工作有不少。本文进行native编程实践,将整个步骤以及注意事项做一个笔记。本次实践不使用任何集成开发编译环境,而是用最原始的文本编辑器+命令行的方式进行。

实例说明:

实现一个简单的jni调用,模拟“通过jni打印log日志,日志由java层传递给c层”。

开发步骤:

分成两大步骤来演示,一, java代码的编辑,编译,以及c头文件的生成;二,c语言代码的编辑,编译。

 1. java代码的编辑,编译,以及c头文件的生成:

1)java代码编辑:MyLog.java文件,内容如下:


public class MyLog {
	//获取c代码的日志
	native void outputLog(String str);
     
    static { System.loadLibrary("clog");}
     
    public static void main(String[] args) {
         MyLog a = new MyLog();
         a.outputLog("I from Java!!!");
         
    }
}

2)编译生成.class文件:

用javac命令编译即可:

aibook@aibookdeMacBook-Pro java_call_c % javac MyLog.java

aibook@aibookdeMacBook-Pro java_call_c % ls

MyLog.class MyLog.java

MyLog.class,就是java字节码文件。

3)生成头文件(.h文件):

用javah命令:

aibook@aibookdeMacBook-Pro java_call_c % javah MyLog

aibook@aibookdeMacBook-Pro java_call_c % ls

MyLog.class MyLog.h MyLog.java

其中,MyLog.h文件的内容如下:

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

#ifndef _Included_MyLog
#define _Included_MyLog
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     MyLog
 * Method:    outputLog
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_MyLog_outputLog
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

2.  c语言代码的编辑,编译:

1)c语言代码:

新建立一个MyLog.c文件,内容如下:

#include "MyLog.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_MyLog_outputLog
  (JNIEnv *env, jobject obj,jstring str)
  {
    const char *cStr = (*env)->GetStringUTFChars(env, str, 0);
    printf("%s!\n", cStr);
    return;
  }

2)编译:编译c代码,用gcc命令将.c文件编译成一个.o:

gcc -I . -c MyLog.c

注意,可能出现如下问题:

fatal error: 'jni.h' file not found

#include <jni.h>

         ^~~~~~~

1 error generated.

显然,是找不到jni头文件的问题。我的解决办法是:

把jni相关的文件copy到自己当前目录,即和代码放在同一个目录下。

jni相关文件的来源:

/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/jni.h

/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/darwin/jni_md.h

运行完gcc -I . -c MyLog.c 命令后的目录文件:

MyLog.c        MyLog.h        MyLog.o        jni.h    jni_md.h        
MyLog.class    MyLog.java

3)链接:再将.o链接成一个lib库:

gcc -dynamiclib -o libclog.jnilib MyLog.o 

libclog.jnilib就是最后生成的nativelib库文件。

运行:

最后,运行结果如下:

MacBook-Pro java_call_c % java MyLog

I from Java!!!!

 运行的时候,有可能出现如下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no clog in java.library.path

at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)

at java.lang.Runtime.loadLibrary0(Runtime.java:870)

at java.lang.System.loadLibrary(System.java:1122)

at MyLog.<clinit>(MyLog.java:6)

 

这是因为虽然库都有了,但是path没有指定。

我的解决方式是:直接在环境变量中指定,如下:

直接修改.bash_profile文件,在PATH环境变量中加入自己的编译目录。

PATH=$ndk:$JAVA_HOME/bin:$PATH:/Users/aaa/work/stu/c_stu/java_call_c

总结一下整个步骤:

1.编写java代码-->  2. javac编译成字节码 --> 3. javah生成c头文件-->

4.编写c代码--> 5.gcc编译c代码为.o文件 --> 6.gcc链接成lib库 -->

7. java运行


 

Java生成jni.h头文件,java调用C方法 图文详解 Java生成jni.h头文件,java调用C方法,举例说明(图文详解) 阅读详情

相关推荐

深入解析OpenJDK编译:JNI实现、跨平台构建与Boot JDK自举原理

Java Native Interface(JNI)是Java平台实现跨平台能力的关键技术,它通过在Java代码中声明native方法,并调用C/C++编写的本地函数,为Java程序提供了直接访问操作系统底层资源和硬件的能力。这一机制使得Java在保持“一次编写,到处运行”特性的同时,能够高效处理文件I/O、网络通信、线程调度等与系统紧密交互的任务。从技术价值看,JNI不仅解决了性能关键场景的需求,还构成了Java生态与原生生态的桥梁,是理解Java虚拟机(JVM)与操作系统交互的核心。在实际应用场景中,开

Hi, Sun 458

Android NDK与JNI交叉编译实战指南

交叉编译是移动开发中的关键技术,它允许开发者在x86架构的PC上生成ARM架构的可执行代码。在Android生态中,NDK(Native Development Kit)提供了完整的工具链支持,结合JNI(Java Native Interface)技术可以实现Java与C/C++的高效交互。现代NDK基于LLVM/Clang工具链,通过目标三元组(如aarch64-linux-android21)指定处理器架构和API级别,配合CMake构建系统可显著提升开发效率。该技术广泛应用于性能敏感场景(如音视频处

cuiyingchan0663的博客 389

Android NDK r26b Windows环境配置与JNI交叉编译实践

在移动应用开发中,当Java层需要调用C/C++高性能逻辑时,JNI(Java Native Interface)是连接两者的关键桥梁。而构建原生代码,则离不开NDK(Native Development Kit)这一套完整的交叉编译工具链。NDK不仅封装了LLVM/Clang编译器,还提供了与Android平台版本对应的系统库与头文件。正确配置NDK环境,是保障原生模块稳定构建的前提。本文围绕NDK r26b在Windows环境下的实际应用,从环境变量设置、JNI头文件生成到基于CMake的多ABI工程组

weixin_31815843的博客 188

Java JNI调用本地动态库使用详解

java native方法与JNI实现 native方法定义:               简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调...

赵英超的博客 7085

jni.h头文件

学习JNI编译时,缺少的jni.h和jni_md.h头文件

ITIL-IT运维管理-概述

ITIL-IT运维管理-概述 概述 IT服务管理(ITSM)是一套帮助企业对IT系统的规划、研发、实施和运营进行有效管理的方法,是一套方法论。ITSM起源于ITIL(IT Infrastructure Library,IT基础架构标准库),ITIL是CCTA(英国国家电脑局)于1980年开发的一套IT服务管理标准库。它把英国在IT管理方面的方法归纳起来,变成规范,为企业的IT部门提供一套从计划、研发、实施到运维的标准方法。 中文名 IT服务管理 外文名 ITService Management 专家

syjhct的博客 4万+

jni.h头文件详解(二)

GetVersion ,DefineClass , FindClass, FromReflectedMethod, FromReflectedField ,ToReflectedMethod, ToReflectedField) 函数的介绍和如何使用这些函数的样例介绍.

shaohuazuo的专栏 9964

多仓智能订单路由与动态优化方案设计

现在有很多商家会有多个仓库,并分布在不同的城市中,当用户下单后会根据商品库存及订单信息将订单分配到对应的仓库进行发货,如就近原则,本期基于多仓库设计一套订单路由方案,包含核心逻辑、规则优先级和实施方案,适用于多仓协同的订单自动分配场景

14年产品经理老兵,想把自己的经验及总结分享给大家,只讲思路及实操,不讲废话 2481

java jni编译

零 绪论今天看安卓的源码。发现很多东西都是jni的东西。所以我也要看看java是怎么和jni通信的。那么就涉及到了编译问题。这种情况下涉及到交叉编译,很烦。网络上也是哀嚎声一片。但是我没有遇到那么多的困难。首先注意几个要点 1你要知道你运行java的程序的版本。我是64位的 2你要知道你gcc编译器编译出来的东西是多少位的 我想很多情况下都是可能gcc编译出来的是32位的东西,你拿到64位jr

bleuesprit的专栏 428

华为HCIP大数据备考实战:从题库精析到834分通关策略

本文详细介绍了华为HCIP大数据认证考试的备考策略,包括题库精析、重点章节突破和考场实战经验。作者以834分的高分通过考试,分享了官方教材的三遍阅读法、自建题库技巧以及各章节核心知识点,帮助考生高效备考并顺利通关。

weixin_29169899的博客 149

Python 爬虫实战:亚马逊商品评论 + 评分抓取(情感分析数据预处理)

在电子商务领域,用户评论是了解产品口碑和市场反馈的重要渠道。亚马逊作为全球领先的电商平台,拥有海量的商品评论数据。本文将详细介绍如何使用 Python 编写爬虫程序,从亚马逊网站抓取商品评论和评分数据,并进行情感分析的数据预处理。

yansideyucsdn的博客 769

JNI 总结

为了使用java调用C、C++代码,所以使用JNI技术来实现此功能 1.首先编写java代码,里面的方法用native关键字来修饰 2.在linux下,用javac命令编译java文件,生成.class字节码文件 3.用javah命令将.class字节码文件生成.h头文件,.h文件是C、C++文件,相当于java的interface接口文件 4.编辑自己的C、C++文件。

Peking之成长路程 259

【DRAM存储器五十五】LPDDR5介绍--command bus training

本文详细介绍了LPDDR5命令总线训练(CBT)的两种模式操作流程。在启用ODT进行高频/中频操作前,必须对命令总线进行训练,包括调整VREF(CA)电压和CA/CS信号时序。两种模式的主要区别在于VREF(CA)设置方式:模式1通过MR12直接设置,模式2通过DMI[0]引脚捕获DQ[6:0]数据更新MR12。训练流程涉及频率切换、模式寄存器配置、pattern发送及结果采样等步骤,最终确定最佳VREF(CA)和时序参数。文章还分析了不同PHY实现可能存在的差异,如训练pattern生成方式和采样次数等。

highman110的博客 648

JNI调用c动态链接库函数代码实践

使用设备:macOS-10.15 jni调用c实践大体流程: 1、>javac HelloWorld.java,生成HelloWorld.class文件。 2、>javah HelloWorld,生成HelloWorld.h头文件。 3、创建HelloWorld.c文件来实现HelloWorld.h头文件; 4、从jdk/include目录拷贝jni.h、jni_md.h、jawt_md.h等头文件到HelloWorld.c同级目录,且.h文件中依赖不要用尖括号,如#include "jni

qq_18520297的专栏 337

PCIe 6.0 – 关于 PCI Express Gen6 您需要知道的一切

幸运的是,PCIe 6.0 FEC 足够轻,对延迟的影响最小。在电气层上,PCIe 6.0 使用 PAM4 信号(“四级脉冲幅度调制”),每个时钟周期将 2 位组合为 4 个幅度级别(00、01、10、11),与 PCIe 5.0 和前几代相比,它使用 NRZ 调制,每个时钟周期 1 位和两个幅度级别 (0, 1)。虽然 PAM4 信号更容易出错,但由于调制技术的性质,与 PCIe 5.0 相比,通道损耗不受影响,因此 PCB 上 PCIe 6.0 信号的范围将与 PCIe 5.0 相同。

qq_43416206的博客 3431

华为OD机试真题 新系统 2026-04-19 C语言 实现【8位LED控制器】

有一个8位LED控制器,包含8个LED灯(编号0-7),初始状态全灭,用8位二进制表示为:00000000。控制器可以接收以下三种指令: Lx:L表示点亮操作,x表示LED的编号(0一7),操作得到的结果是:点亮第x个LED灯,把状态设为1。 Dx:D表示熄灭操作,x表示LED的编号(0-7),操作得到的结果是:熄灭第x个LED灯,把状态设为0。 Tx:T表示切换操作,x表示LED的编号(0-7),操作得到的结果是:切换第x个LED灯的状态,若状态为0则变为1,为1则变为0。 现在给定一组指令字符串(0<

MISAYAONE的博客 147

JNI编译

 javac   xxx.java    javah   -jni   xxx    gcc   -I/usr/java/jdk1.6.0/include     -I   /usr/java/jdk1.6.0/include/linux   -shared   xxxname.c  

weixin_33832340的博客 113

AI大模型探索之路-应用篇11:AI大模型应用智能评估(Ragas)

随着人工智能技术的飞速发展,AI大模型(LLM)已经成为了推动技术创新和应用的关键因素。这些大模型在语言理解、图像识别、自然语言生成等领域展现出了惊人的能力。然而,随着模型规模的增大,它们对计算资源的消耗、环境适应性、模型稳定性、安全性和可解释性等方面也提出了新的挑战。因此,对AI大模型进行智能评估变得至关重要,以确保它们在实际应用中的稳定性、可靠性和有效性。本文将详细介绍Ragas框架,一个专为AI大模型设计的智能评估工具。

寻道AI,探索AI无限可能! 5543

ubuntu下Java通过JNI调用C

下面看一个实例,如下: public class TestJNI { static { System.loadLibrary("diaoyong"); // 程序在加载时,自动加载libdiaoyong.so库 } public native void set(int value); // 声明原生函数。注意要添加native关键字 publ...

dianlong4020的博客 392

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

linux中java通过jni调用so动态库中的方法

项目中需要调用so动态库中的方法来实现需要的功能,所以需要在java项目中通过jni的方式实现调用。 本次学习记录所对应的场景为: 已经有so库和对应方法的头文件提供。 项目提供的so和头文件不是jni的头文件,所以需要自己通过提供的头文件,编写jni方法,然后重新编译一个so文件,然后再把两个so同时加载。(刚开始接触,不知道能不能在没有源码的情况下把两个so编译合并为一个so,这样就...

qq_38862852的博客 3611

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

JNI入门学习笔记(测试环境:ubuntu gcc 4.4.5)

参考文章: http://blog.csdn.net/yuleslie/article/details/7056577 java native specification 官方文档。 深入理解android:卷1 我这里尝试写一个在ubuntu上直接运行的java调用jni程序,通过这个慢慢入门,然后提高吧。 1. 编辑一个java文件HelloJNI.java(名字随意),这个

╰☆╮EvilCode的专栏╭☆╯ 1657

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Android应用集成FFmpeg:从编译裁剪到JNI调用的完整实践指南

音视频处理是移动应用开发中的常见需求,其核心在于对多媒体数据的编解码、封装与滤镜处理。FFmpeg作为一套开源的音视频处理解决方案,通过其模块化设计(如libavcodec、libavformat、libavfilter)提供了强大的底层能力。在Android平台集成FFmpeg,并非简单移植,而是需要针对移动端ARM架构进行交叉编译,并通过JNI(Java Native Interface)桥接Java/Kotlin层与C/C++原生库。这一技术方案的价值在于实现了对音视频处理流程的彻底掌控,避免了第三方

weixin_30781107的博客 313

windows下java调用JNI简单示例

Java JNI(Java Native Interface)是一种用于在Java程序中调用本地代码的技术。

kevinlcsdn的博客 933

mac上简单实现一个java调用C接口的JNI

尝试在MAC笔记本上安装JDK,并通过Java调用C/C++的方式,实现一个简单的JNI

weixin_43158544的博客 837

Java JNI 调用 so 动态链接库

实现一个最简单的 JNI 调用 编写 Java 代码 package sf.gg; public class Hello{ public native static int add(int x,int y); //java 代码中声明 native 方法 static { System.load("/home/lance/main.so"); //以绝对路径加载s

cangdu的专栏 359

JNI编程

JNI介绍 Java 本机接口(Java Native Interface (JNI))是一个本机编程接口,它是 Java 软件开发工具箱(Java SoftwareDevelopment Kit (SDK))的一部分。 JNI允许 Java 代码使用以其它语言(譬如 C 和 C++)编写的代码和代码库。Invocation API(JNI 的一部分)可以用来将 Java 虚拟机(JVM)嵌入...

weixin_33713707的博客 90
上一篇: java中的定时器
下一篇: C语言中的字符串转换函数-atof,atoi,atol,printf,tolower,toupper,toascii...等等
liranke
博客等级 码龄20年 4939粉丝 594原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值