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头文件

一文搞懂STM32定时器翻转模式(产生多路频率、占空比的PWM)

(产生多路频率、占空比的PWM)

weixin_56688599的博客 7935

jni.h头文件详解(二)

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

shaohuazuo的专栏 9964

大数据领域数据架构的工业互联网数据架构设计

工业互联网作为第四次工业革命的重要驱动力,正在深刻改变传统制造业的生产方式和商业模式。本文旨在探讨工业互联网环境下的大数据架构设计,重点解决工业数据采集、传输、存储、处理和分析等关键环节的技术挑战。工业互联网数据架构的核心组件大数据技术在工业场景下的应用数据治理和质量控制边缘计算与云计算的协同架构背景介绍:建立基本概念和问题域核心架构:详细解析工业互联网数据架构技术实现:通过代码和数学模型展示关键技术实践案例:展示真实场景应用工具资源:推荐实用开发工具和学习资源。

软件工程实践的博客 855

java jni编译

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

bleuesprit的专栏 428

matlab 点云按高程进行赋色【2024最新版】

首先按照Z轴方向求取所在点云的高程极值(包括高程最大值与最小值),然后将高程归一化到0~255范围内,最后采用matlab中的colormap颜色渲染函数进行赋色并保存渲染结果到点云。

点云侠的博客 3341

用 ADT 连接 SAP S/4HANA Public Cloud 开发租户的完整落地指南

摘要:在SAP S/4HANA公有云中进行ABAP开发时,必须使用Development Tenant(客户端080)而非Customizing Tenant(客户端100)连接ADT工具。开发用户需具备SAP_BR_DEVELOPER角色且写权限不受限,开发对象应创建在结构包的子包中。连接前需确认正确的ABAP服务URL(通常为Launchpad URL去掉"/ui"),并通过运行控制台程序验证全链路功能。典型开发场景如通过BAdI实现业务校验时,需遵循Clean Core原则在指定包

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

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

FineReport FCP模拟题五

新建决策报表,设置 移动端 格式,采用绝对布局。数据来源:FRDemo中的订单表/雇员表。

Davina_yu的博客 724

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

[ vulhub漏洞复现篇 ] Drupal XSS漏洞 (CVE-2019-6341)

[ vulhub漏洞复现篇 ] Drupal XSS漏洞 (CVE-2019-6341) Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成,在GPL2.0及更新协议下发布。Drupal在某些情况下,通过文件模块或者子系统上传恶意文件触发XSS漏洞。

qq_51577576的博客 2208

C# 上位机内存泄漏排查指南:3 个工具 + 4 个技巧,从 GC 频繁到稳定运行 720 小时

C# 上位机内存泄漏排查的核心是「先定位泄漏存在,再追溯引用根源,最后修复验证通过「Visual Studio 诊断工具(快速定位)+ dotMemory(深度分析)+ PerfView(生产监控)」三个工具的配合,结合「复现场景、排查静态成员+事件、检查非托管资源、GC 日志验证」四个技巧,可高效解决绝大多数泄漏问题。

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

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

Devexpress16.2.6破解工具

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

ubuntu下Java通过JNI调用C

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

dianlong4020的博客 392

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

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

qq_38862852的博客 3611

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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、付费专栏及课程。

余额充值