JNI开发入门

简述JNI开发 JNI全称为Java Native Interface,主要用于实现Java和C/C++的通信。 阅读详情

学Android有一段时间的朋友大部分听过类似NDK,JNI之类的概念。那么这到底是什么意思呢,以及其作用和使用方法呢,今天咱们就来讲一讲这些知识。

一.概念理解。

1.jni:Java native interface:Java本地接口
2.ndk:native development kit:本地开发工具集
3.jni和ndk的关系:ndk是个工具包,就像是sdk一样,为jni开发提供许多的工具。

二.Android开发中,jdk加sdk这么强大的API支持,为何还需要jni呢。

1.jni用c/c++语言开发,执行效率比Java高一些。
2.用jni实现的逻辑代码很难被反编译破解,是Android中加密操作的首选。
3.用jni开发的代码可移植性非常好。

三.jni开发流程(用一个小项目讲解)

1.我们选用eclipse进行开发。首先,需要做两件事情:

  1. 下载并解压ndk。
    密码:5gtw
  2. 配置环境变量。
    打开环境变量“path”,在末尾添加ndk的路径(如果末尾没有分号,需要先添加一个分号,然后再添加ndk的路径)
    比如我的路径是:D:\android-ndk-windows

2.第二我们要开始写代码了。。(实现的功能:点击button,调用c代码弹出一个Toast)

  1. 创建一个工程,打开MainActivity:
  2. 在MainActivity中定义native方法,并监听点击事件。
//用native关键字来声明这是一个本地方法,需要用c语言实现
public native String helloFromC();
//当点击button时调用这个方法,Toast中调用helloFromC()这个方法。
    public void click(View view) {
        Toast.makeText(this, helloFromC(), 0).show();
    }
  1. 实现本地c语言方法。
    看一看使用了jni之后的工程目录,是不是多了几个文件夹:jni,libs,obj
    这里写图片描述

这些东西可以用命令行实现:
ndk-build.cmd

但是往往命令行操作是一件令人头疼的事,这里详细说一下另外一种比较简单的方式:
为了实现这个功能,我们需要先去下载一个eclipse插件:ndk.jar.
但是这个jar包是需要翻墙下载的,这里给提供一个已经下载好的,密码:uw8l,把它直接放到你的这个路径下,然后重启eclipse即可。adt-bundle-windows\eclipse\plugins

  1. 上面的东西整好之后,我们只需要一步,就能做到和命令行一样的效果。
  2. 对着项目名点击右键-》Android Tools-》add native support;
    出现如下对话框。
    这里写图片描述

注意:这里要生成一个.so文件,这个.so文件里就是c语言实现的逻辑,它难以反编译,所以比较安全

随便输入一个名字,比如hello,点击确认。(这个名字就是你的c语言文件的名字,不重要);

好了,到此,就可以开始写c代码了,比如:

#include <jni.h>
jstring Java_com_example_jni_MainActivity_helloFromC(JNIEnv* env,jobject obj){
    return (**env).NewStringUTF(env,"我的第一个jni底层调用~");
}

恩,没错,这就是c代码,看着是不是非常无语,咱们先不管这个,先把功能实现了,回过头来仔细讲一下这个c代码的意思,以及为何要这么写。

3.最后三行代码。。。

上面的内容,主要说明了一下如何创建jni环境,如何写Java代码,如何写c代码。然后剩下的就是调用了,在MainActivity.java中添加下面的代码,来引入c代码库

static{
//加载刚才产生的hello.so
        System.loadLibrary("hello");
    }

ok ,完事了,如果大家跟上了节奏的话,应该是已经可以实现调用了,至于结果的截图,发一个静态的吧,
这里写图片描述

四.遗留问题的解决。

我们还剩下两个问题:
1.上面的c代码还没说明
2.上面的程序只能在arm机器上运行,不能在x86的机器上运行;

解决问题一:

先把c代码拷一份:

#include <jni.h>
jstring Java_com_example_jni_MainActivity_helloFromC(JNIEnv* env,jobject obj){
    return (**env).NewStringUTF(env,"我的第一个jni底层调用~");
}

1.首先,Java语言和C语言本来就是不通的语言,一些数据类型完全不同,比如Java中有String的概念,而c中没有String的概念,所以,需要进行相应的转换。

2.库函数 #include

【Android JNI 开发入门指南】 交叉编译]在一个平台上去编译另一个平台上可以执行的本地代码。交叉编译的实现原理: 模拟不同平台的特性去编译代码。Android系统运行的 CPU 架构 :ARM,X86,mips[NDK (native Develop Kit),谷歌提供的: 用作JNI开发的交叉编译工具集。△安装介绍;如果电脑与JDK都是32位的则选择 android-ndk-r9d-windows-x86 的开发工具包。64为的则选择 android-ndk-r9d-windows-x86_64 的开发工具包。 阅读详情

相关推荐

Android Studio NDK开发案例一 JNI开发入门

        最近在做Android的项目,用到了JNI,现将NDK的开发流程和方法整理出来,希望能够让刚接触的小伙伴们少走一些弯路。 NDK         Native Development Kit(NDK)是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C/C++的动态库,并能自动将so和java一起打包成apk。 JNI         Java Native In...

他乡&学子 3248

JNI开发

Android JNI的使用方法

huang323186的博客 1255

Android Studio JNI开发指南:从入门到精通!

JNI(Java Native Interface)是一种用于在Java和本地代码之间进行交互的技术。它为开发人员提供了使用C/C++编写高性能本地代码的能力,并将其与Java代码无缝集成。本文将介绍如何在Android Studio中进行JNI开发,帮助您快速入门并逐步精通这一技术。

CodeJolt的博客 448

Android JNI开发从0到1,java调C,C调Java,保姆级教程详解

第三歩,在app目录下的build.gradle文件中的,android{}闭包中,指定CMakeLists.txt路径。2.根据命令行javah +JNI2的全类名,生成com_example_jniproject_JNI2.h头文件。在app目录下,指定CmakeLists.txt文件,根据注释进行相应添加。3.根据jni协议,去写对应的c代码,创建Test.c文件,代码如下。2.根据命令行,javah +JNI3全类名,生成对应的头文件。第五步,C代码调用Java代码,首先创建JNI3.java。

路宇的博客 2658

Android JNI开发入门实战指南

JNI(Java Native Interface)是Java平台提供的一种标准接口,允许Java代码与C/C++等本地语言进行高效交互。在Android开发中,JNI不仅为计算密集型任务(如音视频编解码、图像处理)提供了性能优化路径,还支持复用成熟的原生库(如FFmpeg、OpenCV),并可直接访问系统底层资源或硬件接口。其核心机制基于JNIEnv指针和jobject实例,实现跨语言函数调用与数据传递。通过。

weixin_35748962的博客 1035

Android Studio JNI开发从入门到实践

JNI(Java Native Interface)是Java平台提供的一套标准接口规范,允许Java代码与本地代码(如C/C++)进行高效交互。在Android开发中,JNI不仅承担着连接Java虚拟机与本地运行环境的桥梁作用,还为性能敏感型任务(如音视频处理、图像识别、游戏引擎等)提供了底层优化的可能性。其核心作用机制在于通过JNI接口,Java层可以调用C/C++实现的本地方法,反之亦然。这种跨语言调用能力,使得开发者可以在保证应用可维护性的同时,充分发挥底层硬件的性能优势。

weixin_35879493的博客 1011

一篇文章教你完全掌握jni技术

jni全称java native interface,我把它分为三部分,java代表java语言,native代表当前程序运行的本地环境,一般指windows/linux,而这些操作系统都是通过C/C++实现的,所以native通常也指C/C++语言,interface代表java跟native两者之间的通信接口,jni可以实现java和C/C++通信。它是java生态的特征,所以定义在jdk标准当中。

chuyouyinghe的专栏 7300

Impala>Impala安装部署

文章目录1.安装前提2.下载安装包、依赖包3.虚拟机新增磁盘(可选)4.配置本地yum源5.安装Impala6.修改Hadoop、Hive配置7.修改impala配置8.启动、关闭impala服务 1.安装前提 集群提前安装好hadoop,hive。 hive安装包scp在所有需要安装impala的节点上,因为impala需要引用hive的依赖包。 hadoop框架需要支持C程序访问接口,查看下...

qq_44509920的博客 838

Android高级开发第一篇 - JNI(初级入门篇)

本文介绍了Android JNI开发的初级入门知识。首先解释了JNI的概念及其应用场景,如调用高性能库、系统接口等。接着详细说明了开发环境准备和创建支持JNI的Android项目步骤。通过一个"Hello from C++"示例,分析了Java和C++代码的对应关系,包括函数命名规则、JNI关键语法等。文章还讲解了CMake构建脚本配置,并提供了常见问题排查方法。最后预告了后续将介绍JNI参数传递和双向调用等内容。适合有Java/Android基础但零JNI经验的开发者入门学习。

2503_90221393的博客 978

跟着团子学SAP CO:揭秘结果分析码在项目结算中的实战应用(一)KKA2/CJ88

本文深入解析了SAP CO模块中结果分析码在项目结算中的核心作用。以KKA2(方法10)和事务代码CJ88为例,详细阐述了如何在项目完工后一次性确认收入的场景下,通过结果分析功能实现收入与成本的精准匹配,将项目成本暂估为在制品,确保各期利润的准确反映。

gamma的博客 685

PDN设计

作者:AirCity 2020.2.6 Aircity007@sina.com 本文所有权归作者Aircity所有 PDN设计的目的是降低电源纹波水平,减小电压跌落。我们通常要求LDO的文波水平是30mV,DCDC是50mV,超过这个就需要PDN设计。 PDN设计的方法是用不同的容值,合适的总电容量,降低电源平面与地平面之间的交流阻抗,确定容值总量和电容大小的过程,就是PDN设计过程。 为什么需...

AirCity123的博客 4147

Android JNI开发入门

Android JNI开发入门 1 前言 JNI作为JAVA与C/C++库的一种交互方式,在Android系统中被广泛使用,本文将与您一道学习Android中JNI的使用。 因为作者是JNI的初学者,JNI编程经验有限,如有遗漏或有误的地方,请大家帮忙指出,感谢!   2 ANDROID JNI简介 JNI是Java NativeInterfac

ydhua1988的专栏 1332

STM32驱动AS5600磁性旋转位置传感器模块

文章目录简介引脚定义I2C接口写数据读数据从指定的地址开始读数据驱动程序cubeMX配置驱动程序`bsp_as5600.h``bsp_as5600.c`测试程序参考资料 简介 AS5600 是一款易于编程的磁性旋转位置传感器,具有高分辨率 12 位模拟或 PWM 输出。 这种非接触式系统测量径向磁化轴上磁铁的绝对角度。 该 AS5600 专为非接触式电位计应用而设计,其坚固的设计消除了任何同质外部杂散磁场的影响。 引脚定义 I2C接口 7位设备地址为0x36(二进制表示为0110110) 支持标准模式和

ApexYuan 1万+

Android Studio jni开发之经典入门demo

此文记录一下Android Studio 进行jni开发的基础配置以及入门教程,每次都参考网上的,自己记录一下,以后就省事儿了。 一、环境配置 主要需要配置的就是NDK(Native Development Kit),可以一键下载: File → Setting → 按截图找到如下路径 → 选择NDK → 确定下载安装完成以后就可以开始coding了. 二、新建一个项目新建一个项目testJni1

FeiPeng_的博客 1145

【Bug已解决】Request timed out / API Timeout — Claude Code 请求超时解决方案

方案适用场景推荐指数难度方案一:增加超时大任务处理⭐⭐⭐⭐⭐低方案二:切换 SonnetOpus 太慢⭐⭐⭐⭐⭐低方案三:缩小范围大代码库⭐⭐⭐⭐⭐低方案四:优化网络网络延迟高⭐⭐⭐⭐中方案五:减少 MCPMCP 超时⭐⭐⭐中方案六:流式响应长生成任务⭐⭐⭐低根本原因:请求超时最常见原因是请求体过大(35%)和 Opus 模型推理慢(25%),默认 60 秒超时阈值对大型任务不够最佳实践。

一键难忘的博客 5162

基于Matlab模拟RANS湍流——详细分析与源代码

在模拟过程中,我们首先定义了模拟所需的参数,包括流体的动力黏度和密度,以及边界条件和网格分辨率。接下来,通过求解平均值方程和湍流涨落方程,我们模拟了湍流的演化过程。在本文中,我们将使用Matlab对RANS湍流进行模拟,并提供相应的源代码。RANS湍流模拟的基本思想是将流场的变量分解为平均值和涨落值,并通过求解平均值方程和湍流涨落方程来描述流场的演化。请注意,以上代码仅为示例,实际的RANS湍流模拟可能需要更复杂的算法和模型。接下来,我们将求解RANS方程,包括平均值方程和湍流涨落方程。

ByteKnight的博客 862

Android Studio jni开发入门——看我就够了!

1 此贴记录一下Android Studio 进行jni开发的基础配置以及入门教程,想当初使用eclipse配置ndk环境都难,现在基本都向AS转型,特此给需要帮助的新手村的同学们少走弯路☺ 一、环境配置 主要需要配置的就是NDK(Native Development Kit),现在Android studio很便利,可以一键下载: file → setting →

秦军锐士的博客 616

CoppeliaSim和Python进行无人机联合仿真

CopeeliaSim和Python进行无人机轨迹跟踪联合仿真。首先建立起CoppeliaSim和Python的连接,其次在Python中生成轨迹,CoppeliaSim仿真环境中的无人机进行跟踪,并绘制出轨迹曲线,有每一步详细的教学。

加斯顿工程师的博客 987

Android Studio JNI开发入门教程

Android Studio JNI开发入门教程 2016-08-29 14:383269人阅读评论(0)收藏举报 分类: JNI(3) 目录(?)[+] 概述 在Andorid Studio不支持JNI开发之前大家一般都是使用Eclipse开发JNI,各种配置让人觉得很蛋疼。从Andorid Studio支持...

abpwben298703的博客 113

通信原理 | python调制识别数据及代码

数据集包含了从-20dB 到+18dB 总共 20 个信噪比(步长为 2)下的 11 种调制信号, 包括 AM-DSB、 AM-SSB 和 WBFM 三种模拟调制信号,以及 BPSK、 QPSK、 8PSK、 CPFSK、 GFSK、 PAM4、 QAM16 和 QAM64 八种数字调制信号。其中信号的中心频率为 200KHz,采样频率为 1Msamp/s,且每个信噪比下每种调制信号包含 1000 个信号。其中每个信号包含 IQ 两路数据,且每一路数据都包含有 128 个采样点。

若北辰 1758

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

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

Android 开发 之 JNI入门 - NDK从入门到精通

Android 开发 之 JNI入门 - NDK从入门到精通

hggjgff的博客 1106

IEM模型,地表粗糙度模拟

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

Android之JNI开发入门

③ 如果写的是.c的文件 先修改一下生成的.cpp文件的扩展名 不要忘了 相应修改Android.mk文件中LOCAL_SRC_FILES的值。),ANDROID_LOG_DEBUG表示优先级 debug ANDROID_LOG_INFO表示info 这些在log.h中可以看到。window->preferences->左侧选择android->ndk 把ndk解压的目录指定进来。最后一个参数表示是否拷贝,可以不用传值。//返回int* 返回该数组的首地址 这样就可以直接通过该指针直接操作该数组了。

2401_87195798的博客 2348

精雕软件(JDpaint) 5.5 绿色版

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: 总体把握Android中的触摸事件处理
下一篇: Git--团队开发必备神器
肖小的人儿
博客等级 码龄12年 29粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值