Android-JNI调用

Android应用中JNI调用实例教程 本文还有配套的精品资源,点击获取 简介:本教程深入探讨了Android应用中使用JNI进行跨语言通信的过程。通过实例“android调用JNI实例”,介绍了创建Android项目、配置NDK、编写JNI接口、生成头文件、Java层调用JNI以及构建和运行应用的完整步骤。教程还强调了不同平台使用NDK编译和调试的重要性,并提示了使用本地代码时需要注意的问题。 1. ... 阅读详情

JNI的概念

JNI的全称是Java Native Interface。他提供了一种让运行在JVM中的Java代码与C/C++代码交互的方式。应用层和JVM厂商都遵从JNI的规范,这样应用层只需要写一套调用Native层的代码,不需要修改代码兼容不同的JVM实现或版本。Java代码通常是用UTF-16编码的,C/C++的通常采用UTF-8,这种编码方式的转换JNI已经为我们实现了。

JNI的用法

普通java调用
  1. 在Java类已中声明native接口函数,例如:在Hello.java中添加native函数声明public native static void helloNative();
  2. 用 javac 命令将.java源文件编译成.class字节码文件
  3. 用 javah 命令,根据class字节码文件生成.h头文件
  4. 创建C/C++文件,实现.h文件中的接口
  5. 用gcc命令将C/C++文件编译成.so文件
  6. 在Hello.java中调用System.loadLibrary("name")加载动态库文件
Android调用

由于使用javah命令得到的.h文件里函数的规则是固定的,即:Java_类全路径_方法名,因此我们可以不通过javah命令生成头文件。

  1. 在AndroidStudio里下载配置好NDK
  2. 创建一个Android项目,在需要调用的native方法的类中声明所需的native方法。
  3. 在外部(非Android项目目录)新建一个jni目录,新建test.h、test.cpp、Android.mk、Application.mk目录。其中test.h就是按照javah生成的头文件形式创建的。例如:
//test.h
#ifndef __TEST__
#define __TEST__

#include <jni.h>

#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT void JNICALL Java_com_hl_TestHello_helloJNI(JNIEnv *env, jobject thiz);

#ifdef __cplusplus
}
#endif

#endif 
  1. 在test.cpp中include test.h文件,实现native接口。
  2. 在Android.mk中配置好编译项
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := test-jni

LOCAL_SRC_FILES := test.cpp

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog

#LOCAL_LDFLAGS += -ljnigraphics
include $(BUILD_SHARED_LIBRARY)
  1. 在Application.mk中配置编译的目标平台
APP_ABI := all
APP_STL :=c++_shared
  1. 在从终端进入jni目录下,执行ndk-build命令。编译成功后,相应的SO文件在与jni同级目录下的libs文件夹下面。
  2. 将SO文件拷贝到安卓项目中main/jniLibs下
  3. 在调用native方法的Java类中,加载so库:System.loadLibrary("test-jni");

JNI调试

AndroidStudio为开发者提供了一套调试C/C++的工具。这套工具非常强大,能让我们修改完native层的代码之后,立刻编译成SO运行起来。官方教程https://developer.android.com/studio/debug/?hl=zh-cn。

JNI使用注意

  1. 什么时候要主动调用Release方法释放资源?
    答:释放的资源主要包括引用和变量。
    引用资源释放:JNI 规范中定义了三种引用:局部引用(Local Reference)、全局引用(Global Reference)、弱全局引用(Weak Global Reference)。局部引用:通过 NewLocalRef 和各种 JNI 接口创建(FindClass、NewObject、GetObjectClass和NewCharArray等)。会阻止 GC 回收所引用的对象,不在本地函数中跨函数使用,不能跨线前使用。函数返回后局部引用所引用的对象会被JVM 自动释放,或调用 DeleteLocalRef 释放。全局引用:调用 NewGlobalRef 基于局部引用创建,会阻 GC 回收所引用的对象。可以跨方法、跨线程使用。JVM 不会自动释放,必须调用 DeleteGlobalRef 手动释放。弱全局引用:调用 NewWeakGlobalRef 基于局部引用或全局引用创建,不会阻止 GC 回收所引用的对象,可以跨方法、跨线程使用。引用不会自动释放,在 JVM 认为应该回收它的时候(比如内存紧张的时候)进行回收而被释放。或调用DeleteWeakGlobalRef 手动释放。
    变量释放:(1)通过(*env)->GetStringUTFChars获取的,要通过(*env)->ReleaseStringUTFChars释放。
    (2)通过调用GetIntArrayElements等获取数组的方法的,需要调用对应的释放函数释放资源。

  2. 什么时候需要注意检测处理异常?
    答:使用JNIEnv调用其函数,比如FindClass、GetFiledID等方法时,都会有可以返回为NULL,导致接下来的程序出现异常,因此在这些地方我们都需要进行异常检测处理。

参考文章

Oracle JNI Guide
使用 Java Native Interface 的最佳实践
Google AndroidDeveloper JNI Tips

多模态变体—ALIGN:高效的图像-文本学习 ALIGN 论文介绍了该模型的关键技术。无人工标注数据:使用互联网数据进行训练,不依赖人工清洗的数据集。高效的对比学习策略:采用大规模图像-文本配对数据,通过对比学习优化嵌入空间。支持零样本(zero-shot)学习:可以在没有专门训练的情况下执行多种任务,如分类、检索等。可扩展性强:ALIGN 采用高效的 CNN 或 Transformer 作为编码器,适用于大规模计算。 阅读详情

相关推荐

夸克缓存视频合并小工具

原理 使用windows的命令行的copy命令来合并 copy /b 0+1+2+3 new.ts 分析缓存目录结构,发现都是一个m3u8文件带一个同名文件夹 所以分析m3u8并把原来的路径换成这个缓存文件夹路径并按顺序合并即可。 其中碰到的难点是Qprocess在windows不好使,索性直接存成.bat批处理文件再执行 还有就是中文问题,具体在代码里都说了。 代码 (环境Qt5.7.0) 这是mainwindow.h #ifndef MAINWINDOW_H #defin.

natural_Caduceus 1万+

Android Studio NDK环境配置及JNI使用方法

Java通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在Windows平台下是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使Java可以实现和本地机器的紧密联系,调用系统级的各接口方法

Tongseng‘s Blog 3万+

极验第四代滑块验证码破解(三):滑块轨迹构造

极验第四代滑块验证码破解(三):滑块轨迹构造声明 声明 原创文章,请勿转载! 本文内容仅限于安全研究,不公开具体源码。维护网络安全,人人有责。 本文关联文章超链接:

帯泪的鱼的博客 8624

Android-JNI的简单使用

一、什么是JNI 1、jni的含义 JNI即为java native interface Java本地接口;JNI是用来调用本地方法的技术,用来使Java和C/C++进行通信。 简单来说,Java运行一个程序需要和不同的系统进行交互,在windows里就要和windows底层平台交互,mac里就要和mac的底层平台交互, JVM就是通过大量的JNI技术能够使Java运行在不同的系统平台当中,与不同的系统平台底层进行交互。 2、Java与JNI类型对照表 基本类型对照 引用类型对照 3、什么是动态库 静态

HZF 6568

别再用UE5默认材质:用Substance Painter一招提升写实感

今天,我就把这套从模型准备到引擎最终呈现的全流程技巧毫无保留地分享出来,这套方法不仅能让你的作品细节炸裂,更能让你理解次世代PBR(Physically Based Rendering)材质的底层逻辑。

海外旅居设计师,15年设计经验。 1325

路径跟踪 | 图解纯追踪算法Pure Pursuit(附ROS C++/Python/Matlab仿真)

纯追踪算法(Pure Pursuit)参考了人类驾驶行为,其基本思想是在待跟踪路径上设置预瞄点(goal-ahead),通过简单的几何方法驱动机器人跟踪预瞄点直至抵达目标位置.本文详细推导纯追踪算法的理论原理及其变种——自适应纯追踪算法(APP)和规范化纯追踪算法(RPP),并提供ROS C++/Python/Matlab三种仿真实现加深理解

FRIGIDWINTER的博客 8412

Android JNI使用全面讲解

在访问或者设置Java属性的时候,首先就要先在本地代码取得代表该Java属性的jfeldID,然后才能在本地代码中进行Java属性操作,同样,需要调用Java端的方法时,也是需要取得代表该方法的jmethodID才能进行Java方法调用。Java中方法的签名。不知道大家有没有了解过,其实Java中每个方法,都有其对应的签名的。本文是一个 NDK/JNI 系列基础到进阶教程,目标是希望观看这篇文章的朋友们能对Android中使用C/C++代码,集成C/C++库有一个比较基本的了解,并且能巧妙的应用到项目中。

a5566255的专栏 308

Open3D 计算点云配准的旋转和平移误差

通过计算旋转误差和平移误差来量化配准结果与真实变换之间的偏差。

点云侠的博客 253

安卓开发 JNI初探

现在我们开始在环境变量中配置选中此电脑,右击打开属性选中高级系统设置,点击进入环境变量注意:在用户变量中找到Path ,将刚刚安装的NDk目录粘贴进去。(这里按我的安装目录举例)C:\Users\Xcy\AppData\Local\Android\Sdk\ndk\25.2.9519653。

qq_34453595的博客 1022

【StreamSet】ETL之StreamSet之Pipelines的状态监听之WebHook钉钉篇

介绍下StreamSets的状态监听以及钉钉的webhook的互联,这位博友问的恰是时候,不久前我刚刚对接过钉钉的机器人,这次看到这个问题,对我来说,应该轻车熟路了,那就有了这篇博文,状态监听之钉钉篇。...

m0_54252387的博客 488

3.PCIe协议分析1-预备知识点

PCIE协议分析1主要讲一下四方面: PCI-E配置空间 PCI-E地址映射 PCI-E Bar空间 PCI-E层级结构详谈 (1)PCIE配置空间 我们过来学习PCIE的同学应该都接触各种类型的功能芯片吧,这些功能芯片连接在电路里面我们可以认为它是一个外部设备,这些设备里面有自己独有的寄存器区域,比如SDRAM里面的ID寄存器或者其他配置寄存器。好的,其实我们PCIE板卡也相当...

一个早起的程序员 4145

[安卓开发笔记二]android Studio通过jni调用C++代码

[安卓开发笔记二]android Studio通过jni调用C++代码 自己需要用到android studio开发安卓项目,为了效率需要用jni来调用C++底层代码,网上关于这方面的资源十分匮乏,自己踩了很多坑,总算明白android studio是如何进行jni的调用,记录与此,贡献自己的一点力量,让后来人少踩坑 1、开发ide:操作系统win7或者mac均可,这点没有关系哈 androi

u012341163的博客 1万+

携程滑块、点选验证码登录识别逆向

本文分析了携程登录系统的风控机制,主要包含三种验证场景:无验证码、滑块验证码和二次图标点选验证码。通过跟踪risk_inspect风控接口,发现验证流程采用标准AES加密,需提交设备指纹等加密信息。当触发验证码时,需额外提交包含轨迹坐标的verify_msg参数及token/rid参数。最终通过风控检测后,需使用一致的指纹参数和验证token完成加密登录。文章强调所有分析仅用于学习,代码实现需确保符合法律规范。

码王吴彦祖的博客 1102

android jni 调用 java_安卓应用开发通过java调用c++ jni的图文使用方法

首先建议一个工程 HelloJni如下图:按照默认的配置下一步,直到完成 。如下图操作,点击windows菜单-》Prefrence菜单:弹出如下图:选择Andriod ->NDK:配置完成以后,点击工程属性菜单:做这一步的目的是,增加对c++代码的支持,他会自动生成一些东西,你会看到多一个jni的文件夹。这个名字可以默认,就用工程的名字,实际上就是产生的c++代码生成.so文件的名称(wi...

weixin_31965935的博客 206

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android JNI 调用

 Android JNI 调用JNI 是Java Native Interface。Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口。它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行互操作。下面就是我

stevenliyong 的专栏 9125

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Android JNI 调用流程

为啥要用JNI,我个人理解是,Java 代码效率不够高,代码调用底层逻辑隔着一层Java 虚拟机,不能直接操控底层硬件,而C/C++ 可以直接操控硬件设备,对于需要效率更高的操作,就需要通过C/C++ 完成。。比如说我们公司做的一个项目,VR眼镜,连接主机设备,VR需要上报数据给主机,并且显示出来。眼镜转动很快,,如果数据获取慢,那主机显示很延时很久,所以这里java 就不合适了。

xss534890437的博客 1942

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

安卓中的jni调用

背景 1、JNI: Java Native Interface。是一套编程接口,用来实现Java代码与本地的C/C++代码进行交互 2、用途: 可以通过JNI调用系统提供的api,因为操作系统或者抵触硬件驱动几乎都是c/c++写的。Java和C/C++不同 ,它不会直接编译成平台机器码,而是编译成虚拟机可以运行的Java字节码的.class文件,通过JIT技术即时编译成本地机器码,...

调上调下的女生 1402

android调用so封装jni,GitHub - Michelle0716/AndroidJniDemo1: 安卓对c进行so文件打包,并以jni的形式进行调用...

AndroidJniDemo1安卓对c进行so文件打包,并以jni的形式进行调用项目中的部分app : 编译so文件jniDemo: 添加运行so文件开发环境:android studio 3.0.1(As3.0以上创建项目,选择支持c/c++,项目会自动生成需要的配置,不需要在编写cMakeList文件,创建后,直接运行,即可调用cpp里面c文件的内容)配置ndk谷歌官方下载 ht...

weixin_42596214的博客 183

利用安卓源码的例子程序编写调用JNI

在安卓工程源码的development/samples/SimpleJNI目录下,这是一个简单的JNI例子。 首先看里面的Android.mk: # # Copyright (C) 2008 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); #

Fiddle 511

Android平台JNI调用

最近接触了Android平台JNI调用,发现网络资料对此没有从原理到具体实现有一份更为详细的介绍。所以,参照了一些材料并根据项目开发加入自己的一些体会: JNI 的由来 JNI是Java Native Interface的缩写,中文为JAVA本地调用。它允许

3246

android 调用JNI SO动态库

总结一下: android调用android 调用JNI 分为静态调用与动态调用(不论动态还是静态前提都是NDK环境已经配置好的前提下) 一、静态主要就是将c(.c)或者c++(cpp)的源文件直接加到项目中进行调用, 然后在CMakeLists.txt中进行配置。 二、动态调用 1、动态调用使用已经编译好的动态库.so文件 2、android调用ndk类 生成后的so文件 public class SerialPort { p */ publ...

lizhong 3764

android jni调用ioctl实现

系统源码版本:android5.1 ndk版本:android-ndk-r17 Android Studio版本: 3.2 硬件:核心板为64bit 需求:屏幕供应商提供升级程序cpp文件源码,操作/dev/i2c-1,调用ioctl读写数据。需要编写App,调用cpp源码相关接口,App目标平台为Android P,cpp源码与Android平台无关。由于cpp源码平台无关,因此可以采用andr...

weixin_39694445的博客 5636

Android jni的调用过程

1、JNI简介 JNI全称为Java Native Interface(JAVA本地调用)。从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)进行交互。并非从Android发布才引入JNI的概念的。 2、JNI与NDK         简单来说,Android的NDK提供了一些交叉编译工具链和Androi

成长的味道 5493

Java安卓JNI调用C库入门指南

JNI是Java与C/C++之间进行交互的一种技术,它允许Java代码调用本地方法(即C/C++编写的函数),同时也允许C/C++代码调用Java对象和方法。通过JNI,我们可以实现Java与C/C++之间的双向通信,充分利用两种语言的优势。

励志成为一名优秀的全能型软件开发工程师。 1332

android中jni的调用过程,android JNI学习② JNI调用过程

1.Android JNI调用过程1.1 由Android系统加载的JNIAndroid系统在启动启动过程中,先启动Kernel创建init进程,紧接着由init进程fork第一个横穿Java和C/C++的进程,即Zygote进程。Zygote启动过程中会AndroidRuntime.cpp中的startVm创建虚拟机,VM创建完成后,紧接着调用startReg完成虚拟机中的JNI方法注册。在An...

weixin_30400859的博客 1305

安卓 Android JNI 添加 lzma库 并用 Kotlin调用

添加源码 在官网下载源码后,将其中的C目录拷贝到src/main/cpp,并重命名为lzma 添加JNI函数 删除lzma/Util,并新建文件夹lzma/jni,在其下写入如下文件lzma.c。该文件提供可供JNI调用的函数lzma(sf: String, df: String, isEncode: Boolean): String,以实现压缩/解压缩文件的功能 // // lzma.c // Created by rumia on 2021/3/12. // /* Edit from LzmaUtil

星空千代 870
上一篇: 解决-npm:Unexpected end of JSON input while parsing near XXX
下一篇: Android-Glide源码解析(二)线程管理
Huang-Lin
博客等级 码龄10年 20粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值