JNI 基础

2023-11-13

一、JNI 涉及的名词概念

1.1、 JNI:Java Native Interface
  • 它是Java平台的一个特性(并不是Android系统特有的)。实现Java代码调用C/C++的代码,C/C++的代码也可以调用Java的代码.
1.2、 二进制库分类 : 静态库,动态库.
  • 静态库
系统 静态库文件
Windows .lib
Linux .a
MacOS/IOS .a

.a 静态库就是好多个 .o 合并到一块的集合,经常在编译C 库的时候会看到很多.o,这个.o 就是目标文件 由 .c + .h 编译出来的。.c 相当于 .java, .hC 库对外开放的接口声明。对外开放的接口 .h.c 需要一一对应,如果没有一一对应,外部模块调用了接口,编译的时候会提示找不到方法。

.a 存在的意义可以看成 Android aar 存在的意义,方便代码不用重复编译, 最终为了生成 .so (apk)

 

  • 动态库
系统 动态库文件
Windows .dll
Linux .so
MacOS/IOS .dylib

动态库 ,在 Android 环境下就是 .so ,可以直接被java 代码调用的库.

1.3、 CPU 架构(ABI):armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64 

各个平台架构的区别就是指令集不一样,浮点运算能力不一样,按照上面排列的顺序,浮点运算能力运行从低到高。

  • armeabi:这是相当老旧的一个版本,缺少对浮点数计算的硬件支持,在需要大量计算时有性能瓶颈 (微信)
  • armeabi-v7aARM v7 目前主流版本,兼容 armeabi (facebook app)
  • arm64-v8a64 位支持 兼容 armeabi-v7a armeabi
  • mips/mips64: 极少用于手机可以忽略
  • x86/x86_64x86 架构一般用于 TV 电视机 ,兼容 armeabi
  • 建议 android apk 为了减少包体大小只接入 armeabi-v7a 即可

 1.4、 Android 特有的文件 :Android.mk Application.mk

 Android.mk:在 Android 上编译需要的配置文件,相当于 build.gradle,详细细节后面会讲到。
Application.mk:上代码

APP_PLATFORM := android-14 //指定 android 系统
APP_ABI := armeabi-v7a // 指定生成哪个架构的 so
1.5、 NDK :Android 平台上用来编译 C/C++库的工具

二、JNI 在 Android Studio 搭建

(1)调用了System.loadLibrary("helloworld");这句代码代表着,使用这个类之前都会去加载libhelloworld.so 这个动态库。

(2)public native String nativeGetString()//或者external fun stringFromJNI(): String这个方法的实现在 c 层。所以接下来我们要构建 c 层的代码。

(3) 自动生成一个 helloworld_android.c文件

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

JNI 基础 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • spring data jpa 利用@Query进行查询

    介绍 Query注释之前 先看看怎么利用 NamedQuery进行命名查询 1 现在实体类上定义方法已经具体查询语句 Entity NamedQuery name Task findByTaskName query select t fro
  • Python-字符串的世界

    Python字符串的世界 在Python编程中 字符串 String 是一种非常重要的数据类型 用于表示文本信息 字符串可以包含字母 数字 特殊字符以及空格 它们在编程中被广泛用于文本处理 格式化输出 字符串匹配等各种场景 创建字符串 创建
  • PCB是什么?你真的足够了解PCB吗?

    在电子行业有一个关键的部件叫做PCB printed circuit board 印刷电路板 这是一个太基础的部件 导致很多人都很难解释到底什么是PCB 这篇文章将会详细解释PCB的构成 以及在PCB的领域里面常用的一些术语 在接下来的几页
  • C#进行图片压缩(对jpg压缩效果最好)

    直接上代码 1 public static class ImageCompress 2 3
  • 基于5g的交通运输_江苏交通全面开启“5G”加速

    江苏交通全面开启5G加速 2020年4月1日 江苏省交通运输厅 与三大运营商 江苏铁塔公司 签署5G战略合作协议 共推未来交通信息化 数字化 智能化发展 从中国高层的多次部署 到资本市场的资金热捧 近期最受舆论关注的概念之一莫过于 新基建
  • SQLserver中存储过程的应用

    在SQL中 存储过程类似于编程语言的函数 即当创建一个存储过程之后便可以在接下来任何类似的操作是直接调用存储过程 那么我们创建存储过程的优势是什么呢 1 提高性能 存储过程将SQL语句封装在一起 降低了数据传输的成本 减少执行时间 2 提高
  • 虚拟机栈的作用以及特点

    4 虚拟机栈 每个线程运行时所需要的内存 称为虚拟机栈 在jvm里 方法的临时储存是在栈里完成的 每个栈由多个栈帧 Frame 组成 对应着每次方法调用时所占用的内存 每个线程只能有一个活动栈帧 对应着当前正在执行的那个方法 正在运行的方法
  • React Draggable 实现拖拽

    React Draggable 是 react 生态中 最好用的拖拽实现库之一 如果你的应用中需要实现拖拽功能 可以尝试用 react draggable 它可以满足多数情况下的拖拽需求 比如一个弹出设置浮窗 可以相互遮挡的容器之类 在所有
  • 计算机2.0培训心得,信息技术应用能力提升培训心得体会两篇

    信息技术应用能力提升培训心得体会两篇 篇一 本月 我进行了 教师信息技术应用能力提升工程 的学习 学习过程中的每一天我都过得非常充实 这次的培训我学习到了很多 每一个视频的内容都非常有意义 有价值 所以 这段时间 我很认真的学习了此次的培训
  • 搭建Spark所遇过的坑

    一 经验 1 Spark Streaming包含三种计算模式 nonstate stateful window 2 kafka可通过配置文件使用自带的zookeeper集群 3 Spark一切操作归根结底是对RDD的操作 4 部署Spark
  • 2017-03-01-为你的Github生成漂亮的徽章和进度条

    原文来自为你的Github README生成漂亮的徽章和进度条 欢迎去博主的博客体验更好的阅读感受 github上常见的徽章标签和进度条 平时在上github的时候看到别人写的精美的README 我总是感到非常的羡慕 近来我也开始使用mar
  • qml 实现展示本地文件系统

    遍历本地文件 qt 提供了很多种便利类来实现本地的文件系统管理 比如QDirModel和QFileSystemModel qml中又提供了FolderListModel 需要包含Qt labs folderlistmodel 2 0 笔者的
  • 所有能反演SIF的卫星以及下载链接

    转载自科学网张园博客 http blog sciencenet cn blog 3430406 1223659 html 目录 SCIAMACHY GOME 2 GOSAT OCO 系列卫星 轨道碳观察者 TanSat TROPOMI 调研
  • 信息隐藏预测算法之MED

    MED median edge detector 第一次MED算法概念被提出的论文 http www hpl hp com techreports 98 HPL 98 193 pdf 下图为图像矩阵的一部分 用此为例来说明MED预测算法 其
  • 升级windows10

    前言 windows7已经被微软停更了 所以说 有些用户想升级到windows10 这篇文章 将会教你升级windows10 下载windows10最新安装包 有一个网址 建议大家收藏好 windwos10最新版本官网下载 点进去链接 往下
  • Java中泛型 Class<T>、T与Class<?>、 Object类和Class类、 object.getClass() 和 Object.class

    From Java中泛型 Class
  • JavaScript Array 对象

    解释 Array 对象用于在变量中存储多个值 语法 var cars Saab Volvo BMW 第一个数组元素的索引值为 0 第二个索引值为 1 以此类推 数组属性 属性 描述 constructor 返回创建数组对象的原型函数 len
  • 数据库关系模型

    数据库关系模型和SQL 文章目录 数据库关系模型和SQL 安装 SQL语句 DCL DDL 关系 候选键 PRIMARY KEY 主键 Foreign KEY 外键 索引Index B 树 约束Constraint 数据库的三大完整性 域约
  • Lua(9) ——Cocos之_从C++过渡到Lua 文章不错 留下备查

    Lua 9 Cocos之 从C 过渡到Lua 唠叨 现在开始学习Lua了 开始用 Cocos Code IDE 开发cocos2dx的游戏了 可是呢 因为 cocos2dx v3 x 刚刚才出来不久 所以网上的教程大部分都是基于C 版本的
  • JNI 基础

    一 JNI 涉及的名词概念 1 1 JNI Java Native Interface 它是Java平台的一个特性 并不是Android系统特有的 实现Java代码调用C C 的代码 C C 的代码也可以调用Java的代码 1 2 二进制库