教程 | 入门纯手写JNI编译与使用(适合做demo)

JNI编程示例 源代码地址: 链接:百度网盘 请输入提取码 提取码:gtlz 一、Demo介绍 为了更深入的理解Jni编程知识,我们通过一个简单demo把相关知识用实际代码串起来,会有更清晰的认识。在这个demo中,涉及数组处理、字符串处理、类成员变量访问修改等内容,基本涵盖了常见的用法。 相关介绍 涉及文件 (java代码/xml布局文件) demo界面示例 主界面 点击button进入对应示例 s 阅读详情

前言

做开发的,喜欢看源码的同学,肯定会遇到native关键词,接着就会卡在这里进行不下去,因为native对应的代码就是C了,如果要看再底层的代码,就之只能上官网要C层面的代码了。
2年前,笔者开发过JNI(Java Native Interface),java和C都要实现,这里拿出了笔者多年前的笔记,加点润色说明(貌似也没润多少),希望对大家有所帮助。
目标:

  1. 理解native是什么?
  2. 自己如何实现jni调用?

了解什么是native

我们在学习JVM运行数据区的时候,会了解到虚拟机栈和本地方法栈,我自己做笔记、画图做总结的时候,喜欢把这两个划分到一块,这里可以参考下面的图。
JVM运行数据区

那么JNI是什么?为什么会有native关键词?

JNI(Java Native Interface)调用属于线程私有,用于本地方法的运行,一个Native Method就是一个java调用非java代码的接口,一般来说就是C实现了。

为什么需要Java调用C实现?

有时候Java不能提供的功能(例如类加载机制中,bootstrap的作用是加载加载$JAVA_HOME/jre/lib/下核心类库,如rt.jar,而底层源码hotspot,jvm中是由C++实现),或者是由C来处理更方便更快,那么就需要native方法。
java中bootstrap加载核心类,底层源码可以参考查看: jdk8-hotspot,个人认为,有时候看看底层源码,又能理解出一些新知识,有能力的可以多看看。

正片:一个demo

1.准备好环境

准备好JDK,安装好JDK,配备好环境(这里就不加累述)

2.手打一个JNI的java文件

创建一个TestJNI.java文件:
1)vim TestJNI.java
2)按 i 编写(编写了加载so文件的加载路径,与对应的native方法)
3)按ESC键,:wq! 保存退出
手打JNI的Java环境

public class TestJNI {
   
   
	public static native void printTest(String content);
	static 
Android JNI系列详解之CMake编译工具的使用 如图所示,CMake工具的主要作用是,将C/C++编写的native源文件编译打包生成库文件(包含动态库或者静态库文件),集成到Android中使用。 阅读详情

相关推荐

Android:JNI与NDK(四) Shell脚本的学习以及交叉编译libjpeg图片处理库

一、前言 首先,向关注公众号的朋友们道歉,很长时间没更新了,是在惭愧,这段时间忙于结婚等个人事务,耽误了很长时间,除了忙于个人事务额外时间大部分用来整理音视频相关知识点,这部分都会在本系列毫无保留的分享出来。 建议各位小伙伴们可以关注一下我的个人github地址:https://github.com/MISAYAWANGLEI 里面包含NDK,音视频等项目,目前包含播放器,直播,音频的录制编解码等...

qq_16386581的博客 619

【WebRTC】在Android上用NDK编译WebRtc音频增益模块(AGC),降噪(NS),java调用JNI实现功能

目录 ·········前言 ·········前期工作 ·········编译工作 ·········编码工作(AGC-JAVA) ·········编码工作(AGC-JNI) ·········编码工作(NS-JAVA) ········编码工作(NS-JNI) ·········总结 前言 Android 单独抽取 WebRtc-AGC(音频增益) 模块 ...

gjy_it的博客 7530

Android Studio开发JNI示例

JNI和NDK介绍 JNI(Java Native Interface),是方便Java调用C、C++等Native代码所封装的一层接口,相当于一座桥梁。通过JNI可以操作一些Java无法完成的与系统相关的特性,尤其在图像和视频处理中大量用到。 NDK(Native Development Kit)是Google提供的一套工具,其中一个特性是提供了交叉编译,即C或者C++不是跨平台的,但通过N...

wzhseu的博客 3万+

Android Studio Jni开发详细入门,Aes加密demo

Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。     由于Android的应用层的类都是以Java写的,这些Java类编译为Dex型式的Bytec

a12a15a05的博客 1376

Android JNI 入门(含完整Demo)

/JNI 头文件//解决循环拷贝问题#ifndef _Included_com_example_jni_MainActivity //如果没有定义这个宏#define _Included_com_example_jni_MainActivity//就定义这个宏#ifdef __cplusplus //如果是 C++环境,就使用 C 的环境extern “C” {//全部采用 C 的方式,采用 C 是为了不准你函数重载(解决函数名冲突的问题)#endif。

2401_84009837的博客 914

android soundtouch demo 之NDK编译之路

首先,我想说的一句话在新技术,困难前面不要畏缩,毕竟soundtouch别人已经编译成功过,技术上是没有问题的,即是自己想编译一个NDK本地例子,也不要胆怯。马云说过今天很残酷,明天更残酷,后天很美好。但是很多人死在了明天晚上。l在inux下搭建环境对初学者实属不易,说了这么多废话,就是想说遇到问题时要坚持,要执着。等到拨云见日的那一刻,你会发现很美好。 转入正题,目前我看到soundtouch

mahaichao540174345的专栏 7230

【一起学Rust | 进阶篇 | jni库】JNI实现Java与Rust进行交互

在Rust语言中文社区中看到了大佬metaworm的这样一篇帖子《Rust与Java交互-JNI模块编写-实践总结》,里面详细阐述了Rust如何使用JNI与Java进行交互,在本人的学习过程中也是发现了一些小的错误,经过调整后,文章的例子得以运行。本文旨在推广其实战经验,修复其存在的一些影响读者阅读的小问题,推动Rust开发生态的普及。JNI是一套Java与其他语言互相调用的标准,主要是C语言,官方也提供了基于C的C++接口。理论上支持C API的语言都可以和Java语言互相调用,Rust就是其中之一。

专注Rust编程与技术分享,涵盖C++、Python等开发实战,新手友好,专注实战,助力编程成长。 7万+

Android JNI 入门(含完整Demo)(1)

#ifdef __cplusplus //如果是 C++环境,就使用 C 的环境 extern “C” {//全部采用 C 的方式,采用 C 是为了不准你函数重载(解决函数名冲突的问题) #endif #undef com_example_jni_MainActivity_A//自动检测 MainActivity 生成宏 #define com_example_jni_MainActivity_A 234L//函数的声明 extern “C” JNIEXPORT jstring JNICALL Java_c

2401_84123077的博客 900

Android Studio 进行JNI编程的一个小DEMO

俗话说好脑子不如一个烂笔头,今天开始借助优快云的博客功能来记录自己学习经历。第一个例子android studio实现JNI编程 使用Android Studio 进行JNI编程的步骤如下: 1.在新建的moudle上鼠标右键选择moudle setting,看一下NDK的位置,如果没装NDK,需要手动安装一下。 2.需要在project下的gradle.properties中添加下面一句

whhitzw的博客 641

Android JNI编译SO库完整demo实现高斯模糊效果

很久没用玩jni ndk编译so库了,为了防止手生就用最近需要实现的一个高斯模糊算法类练手。当然这个算法不是我实现的,我只是把这个算法C代码编译成了一个so库,因为C执行效率比java更高,作为这个吃CPU的算法很适合做成SO文件。 这里不再介绍JNI和NDK了,我要说的重点是一个SO库从编译到使用的这个过程。 上面图片可以清除看到这个SO库的生成和java层代码通过KJNI环境调用C/C...

zhuxingchong的博客 482

Androidstudio编译c/c++jni方法

本文微信公众号授权fanfan程序媛独家发布 转载注明出处: 本文出自fanfan的博客Androidstudio编译jni 开发环境:Androidstudio2.3 开发目的:在Androidstudio上编译c/c++jni并自动生成so库,在java类中引用。 开发过程中遇到的问题很多,但终归是成功了,记录下来用Androidstudio的准备 遇到的问题诸如: 再比如

fanfan 1万+

Android NDK和JNI简略总结、使用示例

一、JNI (Java Native Interface) JNI是Java提供的与系统Native库交互的一种机制。 Java代码运行在JVM中,JVM可以跟操作系统来调用系统的Native动态链接库。 这些动态链接库由C/C++源代码来编译生成,在不同操作系统中格式不同,例如在linux平台下会编译为.so或.a文件,在window平台下会编译为dll文件,在mac os下会编译为jnilib。 Android是基于Linux的,所以在Android平台上JNI调...

u013914309的博客 1055

Android Studio NDK-Jni开发小Demo

Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。由于Android的应用层的类都是以Java写的,这些Java类编译为Dex型式的Bytecode之后

初来乍到 7116

adb详细教程(四)-使用adb启动应用、关闭应用、清空应用数据、获取设备已安装应用列表

adb对于安卓移动端来说,是个非常重要的调试工具。通过ADB可以操作、管理设备上的应用。

公众号|软件测试老吴 3万+

PHP服务端 苹果支付(IAP)处理

公司做的app需要做IAP订阅支付,开始觉得和微信的支付流程差不多,做起来还是有点麻烦,主要是网上的文章很少,不能拿来主义。自己做完总结一下,希望对小伙伴们有帮助我就很欣慰了。代码写的不好 不要喷我。。。 首先讲一下我的业务逻辑,也就是php服务端需要做什么事情。 先上图: 下面我详细的讲一下每...

山水的博客 1万+

吉林大学软件工程章节测验 第九章 答案+解析

4.【判断题】估算软件规模有代码行技术和功能点技术两种方法,其中代码行方法估计实现一个功能所需要的源程序行数,其不依赖项目所使用的开发语言,并且具有较好的直观性。3.【单选题】软件项目估算时,若计划人员对每个功能分别按最佳的、可能的、悲观的三种情况给出功能点估计值,记作a, m, b,则估算的期望值E的公式为( )。8.【判断题】在工程网络图中,如果在由起始事件至终止事件所构成的一条路径上,所有事件的最早时刻都和最迟时刻都相同,那么这条路径就是关键路径。4.【单选题】配置管理贯穿软件开发的整个过程。

m0_51459931的博客 1430

TC275-AutoSAR实战:Davinci Cfg多核OS配置与调试技巧

本文详细介绍了在TC275芯片上使用Davinci Cfg工具进行AutoSAR多核操作系统配置的实战步骤与调试技巧。内容涵盖从导入arxml文件的常见“坑”开始,到配置Det、EcuC、创建多核OS实例、关联OS应用、创建任务与设置优先级调度,最后分享了利用Det日志、调试器多核视图及处理核间通信与缓存一致性等关键调试方法,旨在帮助开发者高效完成复杂车载ECU软件集成。

weixin_29219189的博客 488

机床联网系列总结

总结机床联网专栏,两个好用的工具介绍,以及后续提升的方法和建议。

若云流风的专栏 933

[xboard-ok210] 44 s5pv210开发板介绍和对比

文章目录前言四大S3C6410提供商友坚开发板UT-S5PV210华天正(润尔)real210飞凌开发板ok210九鼎x210友善之臂开发板tiny210mini210smart210天嵌开发板tq210sate210xboardxboardxboard之ok210 前言 四大S3C6410提供商 友坚开发板 UT-S5PV210 华天正(润尔) real210 飞凌开发板 ok210 九鼎 x210 友善之臂开发板 tiny210 mini210 smart210 天嵌开发板 tq210 sate210

鹰之翔 286

基于STM32设计的环境检测系统(OneNet)_365

本项目设计并实现了一种基于STM32F103RCT6单片机的环境检测系统,系统集成了多种传感器模块,具备对环境温湿度、烟雾浓度、易燃气体浓度、一氧化碳浓度和整体空气质量的实时检测功能。系统通过1.44寸SPI接口LCD实现本地数据显示,同时配备有源蜂鸣器用于环境异常报警。在数据通信方面,系统利用ESP8266-WIFI模块,采用MQTT协议将各类传感器数据上传至OneNet云平台,并借助其可视化框架实现网页端可视化界面,可通过电脑和手机浏览器远程访问,实现环境数据的远程监控。该系统设计结构简单、功能全面,适

2189

《C#零基础入门之百识百例》(七)算数运算符 -- 圆的面积

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C# 有丰富的内置运算符,本文带你学习C# 中算数运算符。

陈言必行 -- Unity游戏开发领域优质博主 3613

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

廖雪峰Python教程[完整版]

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IDEA的使用指南

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

上一篇: Java8-使用stream实现list中对象属性的合并(去重并求和)
下一篇: 啊~ 修改gitlab本地文件权限导致不能push、pull!千古罪人
lietobrain
博客等级 码龄11年 227粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值