Android JNI编程 与 NDK开发(一) 简介,区别,使用场景

2023-10-31

JNI是什么?

JNI(全称Java Native Interface),是java与其他语言(主要是c/c++)交互的接口,是java的一种特性一种协议,开发者可以通过JNI在java中调用c/c++代码或在c/c++中调用java代码。

NDK是什么?

联系一个叫做JDK的东西,其实可以猜到个大概了,Android NDK(Native Development Kit ),是安卓的一个开发工具包。这里要注意一个是,JNI是java的技术,但是NDK是安卓自己的东西,跟java没关系。

可以这么说,JNI是最后想要达成的目的,即java与其他语言交互的目的,NDK是一个工具包,提供了实现这个目的的手段。

NDK官方文档中是这样描述的。

Android NDK 是一组允许您将 C 或 C++(“原生代码”)嵌入到 Android 应用中的工具。 能够在 Android 应用中使用原生代码对于想执行以下一项或多项操作的开发者特别有用:

  • 在平台之间移植其应用。

  • 重复使用现有库,或者提供其自己的库供重复使用。

  • 在某些情况下提高性能,特别是像游戏这种计算密集型应用。

 

为什么要用JNI和NDK开发,并且什么时候用它们呢?

一、是各种语言有自己的优点也有不足之处,比如,c/c++的效率是高于java的,在某个功能的性能十分重要的情况下,会考虑用c/c++来写那部分,然后再通过JNI调用。

二、也是为了让一些已经写好的c/c++库可以重用

三、并且c/c++编译后的代码更难被反编译,加密算法用c/c++来写更安全。

如果使用java与本地已编译的代码交互,通常会丧失平台可移植性。

怎么使用它们呢?

多数情况下我们会把c/c++语言编译成动态链接库(windows一般是dll文件,linux一般是so文件等,android是基于linux还记得吧,所以在android也是以so格式存在的),然后在android java源码中用System.loadLibrary(libname)或Runtime.getRuntime().loadLibrary(libname)这两个函数加载so库。

 

AS2.2以下实现步骤一般是(2.2以上的在新建项目的时候勾选c/c++ support就可以直接用修改app\src\main\cpp下的native-lib文件实现)

一、在java类中声明java native 方法

二、将该类编译成.class文件(用javac或者AS中直接run)

三、利用javah命令导出JIN头文件(.h文件)

四、用c/c++实现刚刚ava中声明的native方法,然后编译成.so文件、

五、调用运行java的native方法。

 

后面几篇开始会结合例子详讲NDK开发的具体应用例子。注意的是AS 2.2前后的区别,看看自己的版本跳转。

Android JNI'编程 与 NDK开发(二)AS 2.2以上NDK开发

下面贴一些JNI的基本知识和JNI之常用函数大全。(函数大全跳这个链接去H_bolin大神的博客里看就好

                                    Java基本数据类型对应的C语言基本数据类型

              

                                    引用类型

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android JNI编程 与 NDK开发(一) 简介,区别,使用场景 的相关文章

  • NDK编译时报错: Android NDK: NDK Application 'local' targets unknown ABI(s): arm64-v8a x86_64

    网上下了一个github项目 NDK编译时报错 Android NDK NDK Application local targets unknown ABI s arm64 v8a x86 64 Android NDK Please fix
  • jni开发:jni基础教程及实例(一)

    本篇博客将带初次接触jni的小白完成对jni基本知识的了解 本篇主要以概念为主 下一篇博客会带大家完成一个难度不大的jni实例 请两篇博客连起来看 谢谢支持 一 jni简介 1 jni的全称就是Java Native Interface 就
  • C语言基础入门详解三

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 一 C语言之函数指针 include
  • Android 使用OpenCV的三种方式(Android Studio)

    其实最早接触OpenCV是很久很久之前的事了 大概在2013年的5 6月份 当时还是个菜逼 虽然现在也是个菜逼 在那一段时间 学了一段时间的android 并不算学 一个月都不到 之后再也没接触android 而是一直在接触java web
  • OpenCV源码Android端编译,用时三天,我编了个寂寞。。。

    学更好的别人 做更好的自己 微卡智享 本文长度为1526字 预计阅读4分钟 导语 全网首发微信二维码引擎Android平台移植 中有介绍OpenCV源码及扩展模块Android端的编译 其中扩展模块里的人脸细节特征点是准备要测试看看的 于是
  • java.lang.UnsatisfiedLinkError: Native method not found 三种可能解决

    http blog csdn net lilu leo article details 10950047 so文件编译生成后 运行时 有时候会遇到Java lang UnsatisfiedLinkError Native method no
  • Android 使用ffmpeg软编码 将摄像头采集视频编码成视频文件

    Android 使用ffmpeg软编码 将摄像头采集视频编码成视频文件 这次代码实现的是视频采集的功能 Android 通过jni 调用ffmpeg 编码yuv数据变成视频文件 先上代码 编码器上下文保存的实体 struct EnCodeB
  • Android JNI实现锅炉压力显示系统详解

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 第一步创建GuoLu c文件 Created by DELL on 2023 8 13 include
  • 如何在Java项目中定义并调用自己编写的native方法?

    如何在Java项目中定义并调用C C 编写的native方法 开发工具 编写测试的java代码 编写C 代码 将dll文件链接到java项目中 总结 开发工具 IntelliJ IDEA 2020 用来编写java代码 Visual Stu
  • jni入门级别教程

    前提条件 笔者假想着 能看到这篇博客的读者 NDK环境 已经配置好了哈 开发步骤 第一步 新建工程 工程建完之后在真机或模拟器上运行一遍 确保工程建的没问题 第二步 配置NDK 第三步 在Java中添加 native 函数 并 调用 我们这
  • Java调用Native方法

    Java调用Native方法 Java中支持调用其他语言 C C 想要实现调用 需要进行以下几步操作 编写Java类并声明Native方法 package my mynative background public class Studen
  • cocos2d-x中有一个JniHelper类详细使用

    主体思路 通过JNI获取java虚拟机 再获取当前程序的JNI环境 通过JNI环境获取需要调用的java类信息 再获取需要调用的java类中的函数信息 再通过JNI环境调用 使用类信息 函数信息 调用对应的java函数 看起来好像有点复杂
  • 在 Android Studio 2.2 中愉快地使用 C/C++

    使用 Android studio 你可以将 C 和 C 代码编译成 native library 然后打包到你的 APK 中 你的 Java 代码可以通过 Java Native Interface JNI 调用 native libra
  • jni中如何查看函数签名

    操作步骤 第一步 找到 build 文件夹 第二步 找到 javac 文件夹 第三步 找到自己写的 xxx class文件 第四步 右键 xxx class 文件 在 Terminal 中打开 第五步 执行 javap s xxx clas
  • Android NDK 编译时出现make (e=2): 系统找不到指定的文

    今天编译一个so文件时出现如下错误 C Users xxj Desktop test OpenCamera gt ndk build armeabi v7a Compile SeetafaceSo lt face detection cpp
  • 【OPENGLES】opengles-jni实例1

    首先 说明下为什么要用jni实现opengl es 在进行移动端图像算法开发的过程中 需要完成对大量的数据进行处理 opengl是在进行图形渲染或者大批量图像运算处理时有着很大的优势 如果能够在算法库开发中加入opengl 则对于提升算法运
  • 仿网页列表的实现

    序言 实现思路 代码实现 效果展现 总结 序言 最近遇到了一项需求 用Android实现网页中的列表效果 首先我便想到了用ListView的方式来实现 由于网页的表格数据通常都是以一行的形式展现的 因此 我把需要展现的数据放在了一行 可是需
  • Android中JNI在C/C++中的区别

    一 一个疑问 在进行JNI编程中 同样一个函数FindClass C和C 中有不同的用法 如果是C 要用 env gt FindClass str 如果是C要用 env gt FindClass env str 类似的区别几乎涉及到每一个结
  • javah用法

    正确做法 进入到包com所在的目录 是java文件所在的包 不是class javah classpath jni com jnitest MainActivity 如果执行这个 javah jni com example zndktest
  • 使用Visual Studio 2019和IntelliJ IDEA 2018实现JAVA调用本地代码

    使用Visual Studio 2019和IntelliJ IDEA 2018实现JAVA调用本地代码 1 我们使用的工具是 IntelliJ IDEA 2018 编写java代码 和VisualStudio 2019 编写Native方法

随机推荐

  • 【华为OD机试2023】荒地电站建设 java

    荒地电站建设 代码仅供参考 若需使用请进行一定修改 提供java代码 题目 题目描述 祖国西北部有一片大片荒地 其中零星的分布着一些湖泊 保护区 矿区 整体上常年光照良好 但是也有一些地区光照不太好 某电力公司希望在这里建设多个 光伏电站
  • 01-windows调试工具(ProcDump使用)

    工具msdn下载地址 https learn microsoft com zh cn sysinternals downloads procdump csdn的下载地址 windows调试工具 C 文档类资源 CSDN下载 ProcDump
  • 使用注解开发(CRUD 注解增删改查)

    我们可以在工具类创建的时候实现自动提交事务 方法存在多个参数 所有的参数前面必须加上 Param 注解 注意 所有的基本类型和String类型都要加上 Param 如果是User和Map等等之类的对象不需要加 Param 注意事项 1 设置
  • 【2019.05.26】JS逆向——破解 企名片 参数(encrypt_data)爬虫 超级详细

    参考这个博客 作者写的很流畅 一看就是个大佬 要向大佬学习 企名片地址 要获取图中数据 分析请求 根据大佬博客的点拨 我们可以知道这个网站的数据都在这个参数当中 要获取这些数据 我们需要这个网页是怎么把这一段参数解析的 解析参数 encry
  • AI平台介绍及竞品分析

    一 概念 what 在说AI平台之前 首先可以对AI进行了一个大致的解释 AI即人工智能 是研究并模拟 延伸和扩展人脑复杂行为的一种技术科学 范围包括机器学习 计算机视觉等等 那么AI平台就是支持这种复杂科学研究的一种辅助工具 该工具可以进
  • 判断是否是Symbol类型

    判断 value 是否是 Symbol 类型 Checks if value is classified as a Symbol primitive or Object param value The value to check retu
  • 常见多线程与并发服务器设计方案举例

    常见多线程与并发服务器设计方案举例 一 3点基础知识 1 一个主机的端口号为所有进程所共享 但普通用户进程绑定bind不了一些特殊端口号如20 80等 多个进程不能同时监听listen同一个端口 会失败 当然父进程可以先listen然后fo
  • kotlin时间戳转格式化时间

    kotlin时间戳转对应时间格式有很简洁的语法糖 下面就一起了解一下吧 比如说UI图需要这样的时间格式 10月20日 10 24 data createTime toLong formatBy MM月dd日 HH mm 10 20 10 2
  • 【VirtualBox】win10安装配置 Vbox---超详细 最新 持续更新中

    概述 一个好的文章能够帮助开发者完成更便捷 更快速的开发 书山有路勤为径 学海无涯苦作舟 我是秋知叶i 期望每一个阅读了我的文章的开发者都能够有所成长 一 开发环境 VirtualBox 官网 开发环境 windows10 VirtualB
  • 程序,进程,作业之间的区别和联系

    程序与进程之间的区别 1 进程更能真实地描述并发 而程序不能 2 进程由程序和数据两部分组成 进程是竞争计算机系统有限资源的基本单位 也是进程处理机调度的基本单位 3 程序是静态的概念 进程是程序在处理机上一次执行的过程 是动态的概念 4
  • vue-cli3.0 项目内使用vue-skeleton-webpack-plugin插件根据路由来渲染不同的骨架屏

    为了前端体验更加友好 减缓用户的焦虑情绪 提升项目质量等 我们在项目里面可以使用骨架屏 提前渲染出来一个跟正式页面相似的页面出来 减小首屏加载时间 在vue中使用骨架屏 因为我们的代码会使用webpack打包 所以在我们的js下载运行之前
  • Django电商项目(九)用户中心-订单页、支付宝对接、订单评论

    Django电商项目 订单支付页面 用户订单页面 支付宝支付 订单评论 订单支付页面 订单支付模板 extends base user center html load staticfiles block right content div
  • Dynamics CRM邮箱配置

    Dynamics CRM对邮箱有很好的支持 开通邮箱后方便用户通过邮件进行Dynamics CRM的业务处理 同时也可以作为一直消息流提醒的手段应用于审批 通知等场景 可以做一些更深入的功能拓展 本次集成以Outlook邮箱为例 集成方式使
  • Webpack基础打包

    认识webpack 事实上随着前端的快速发展 目前前端的开发已经变的越来越复杂了 比如开发过程中我们需要通过模块化的方式来开发 比如也会使用一些高级的特性来加快我们的开发效率或者安全性 比如通过ES6 TypeScript开发脚本逻辑 通过
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 利用LSB算法隐藏文字信息的MATLAB实现

    LSB算法 隐藏文字信息 LSB Least Significant Bit 最低有效位 指二进制中最低位数值 详见WiKi https en wikipedia org wiki Least significant bit 隐写术 隐写术
  • FPGA原理与结构——FIFO IP核原理学习

    一 FIFO概述 1 FIFO的定义 FIFO是英文First In First Out的缩写 是一种先入先出的数据缓冲器 与一般的存储器的区别在于没有地址线 使用起来简单 缺点是只能顺序读写数据 其数据地址由内部读写指针自动加1完成 不能
  • No module named ‘tensorflow.examples.tutorials‘报错解决办法

    如图该情况报错 解决办法 1 照着图片上 打开anconda中的cmd prompt 输入如下代码 如下图 查看自己tensorflow安装路径 activate tensorflow python import tensorflow as
  • 375. 猜数字大小 II

    我们正在玩一个猜数游戏 游戏规则如下 我从 1 到 n 之间选择一个数字 你来猜我选了哪个数字 如果你猜到正确的数字 就会 赢得游戏 如果你猜错了 那么我会告诉你 我选的数字比你的 更大或者更小 并且你需要继续猜数 每当你猜了数字 x 并且
  • Android JNI编程 与 NDK开发(一) 简介,区别,使用场景

    JNI是什么 JNI 全称Java Native Interface 是java与其他语言 主要是c c 交互的接口 是java的一种特性一种协议 开发者可以通过JNI在java中调用c c 代码或在c c 中调用java代码 NDK是什么