展开

关键词

Android基础--JNI

1 JNI_OnLoad Dalvik虚拟机加载C库时,即执行System.loadLibrary()函数时,第一件事是调用JNI_OnLoad()函数。 可以在JNI_OnLoad 去注册方法 JNI_OnLoad --> registerNativeMethods Android系统加载JNI Lib的方式 通过JNI_OnLoad 如果JNI Lib 没有定义JNI_OnLoad,则dvm调用dvmResolveNativeMethod进行动态解析 2 JavaVM JavaVM 是 Java虚拟机在 JNI 层的代表, JNI 全局只有一个, 即一个进程只有一个 JNI函数,本地方法通过JNI函数来访问JVM中的数据结构 3.1 JNIEnv 作用 调用 Java 函数 : JNIEnv 代表 Java 运行环境, 可以使用 JNIEnv 调用 Java 中的代码 比如,在jni的方法中起了线程去处理事件,处理完后希望能通知java层,线程中是不能使用参数JNIEnv的。

57310

Android 增加JNI

AndroidJNI 与 NDK到底是什么?(含实例教学) 前言 在android开发中,使用NDK开发的需求正逐渐增大; 很多人搞不懂JNI与NDK到底是怎么回事? 或 C、C++代码调用 Java 代码 特别注意: JNI是 Java 调用 Native 语言的一种特性 JNI 是属于 Java 的,与 Android 无直接关系 1.2 为什么要有JNI 背景 ,并自动将so和应用一起打包成 APK 即可通过NDK在 Android中 使用 JNI与本地代码(如C、C++)交互 应用场景:在Android的场景下 使用JNIAndroid开发的功能需要本地代码 下面我讲解一下JNI类型与Java类型对应的关系介绍 步骤4:创建Android.mk文件 作用:指定源码编译的配置信息 如工作目录,编译模块的名称,参与编译的文件等 具体使用 Android.mk " android:layout_height="50dp" android:text="调用JNI代码" /> </RelativeLayout> 结果展示

9840
  • 广告
    关闭

    腾讯云服务器买赠活动

    腾讯云服务器买赠活动,低至72元1年,买就送,最长续3个月,买2核送4核、买4核送8核

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android JNI(一)——NDK与JNI基础

    不过,Google从一开始就说明Android也支持JNI编程方式,也就是第三方应用完成可以通过JNI调用自己的C动态度。于是NDK就应运而生了。 ndk到so.png 从上图这个Android系统框架来看,我们上层通过JNI来调用NDK层的,使用这个工具可以很方便的编写和调试JNI的代码。 oracle中关于JNI的指导 Java调用C/C++在Java语言里面本来就有的,并非Android自创的,即JNIJNI就是Java调用C++的规范。 当然,一般的Java程序使用的JNI标准可能和android不一样,AndroidJNI更简单。 Android JNI学习(二)——实战JNI之“hello world”

    90331

    Android JNI 开发

    概述 几乎稍有经验的Android开发,都会在工作中用到JNI的开发。即使工作中没有涉及到JNI的开发,在我们使用第三方的库时,也经常需要引入.so文件。 最初我在学习JNI开发时,基本是懵的。 因为大部分JNI开发的指南,其实是在教我们,如何生成.so文件和如何引入.so文件。 我们参照着博客的步骤,修改build.gradle,添加cmakelists,写JNI接口,写c++。 这也导致每次JNI的配置步骤,看一次忘一次。 本文旨在彻底写清楚,当我们在做JNI开发时,我们在做什么。 Android是如何使用.so文件的了。 需要进行JNI开发,需要明白的一些基础知识。

    62810

    android studio JNI使用

    操作命令: javah -d jni -classpath <SDK_android.jar>;<APP_classes> <class> javah -d jni -classpath c: \Users\Ximei\AppData\Local\Android\sdk1\platforms\android-21\android.jar;..\.. 然后就看到<project>\app\src\main\jni\com_example_jnitest.h出现了.  Step: 4.编辑c文件 在<project>\app\src\main\jni\jnitest.c文件中实现头文件中的函数。 ndk.dir=C\:\\android-ndk-r10d 2.

    38080

    Android JNI 数组操作

    JNI 中有两种数组操作,基础数据类型数组和对象数组,JNI 对待基础数据类型数组和对象数组是不一样的。 在 Android JNI 基础知识篇提到了 Java 数组类型对应的 JNI 数组类型。 findClass 的参数 [I 这里就涉及到 Java 与 JNI 对应签名的转换。 Java 与 JNI 签名的转换 在前一篇文章中,用表格列出了 Java 与 JNI 对应的数据类型格式的转换关系,现在要列举的是 Java 与 JNI 对应签名的转换关系。 这里的签名指的是在 JNI 中去查找 Java 中对应的数据类型、对应的方法时,需要将 Java 中的签名转换成 JNI 所能识别的。

    55740

    android Ndk JNI 入门

    你知道开发jni吗?你熟悉jni语法吗?怎么配置android studio 中的NDK环境?此时你一定很懵逼,我也是从这过来的,我不能帮助你开发Ndk,但是我可以让你不懵逼。 从上图这个Android系统框架来看,我们上层是通过JNI方式来调用NDK层的,使用这个工具可以很方便的编写和调试JNI的代码。 以往Android NDK开发需要在Eclipse或源码环境下,建立并配置Android.mk和Application.mk,且还要通过java命令生成.h头文件,才能编译生成so库。 2、新建一个Android标准工程,并在工程设置中配置NDK路径。 ? 宣布Android Studio开始支持NDK开发,通过和JetBrains的合作,将Clion整合进了Android Studio 1.3,并免费支持NDC++开发。

    54020

    深入 Android 系统 - AndroidJNI

    JNI 的作用 JNI是Java Native Interface的缩写。JNI不是Android专有的东西,它是从Java继承而来的,但是在Android中,JNI的作用和重要性大大增强了。 因此,在Android的开发中,无论是应用级的开发,还是系统级的开发都离不开JNIAndroid在编译、应用打包和安装、程序装载等各方面都对JNI进行了有力的支持。 Android JNI 动态库必须以lib开头,这里传入的参数是去掉前缀lib,以及后缀.so的中间部分。 中的异常处理 在 JNI 中检查Java层产生的异常 首先要明确的是,Android的C++层不支持try-catch机制 如果JNI调用Java层的方法时发生了异常 JNI调用会正常返回 但是,如果继续调用其他 因此,Android定义了一个名为debug.checkjni的属性: 当值为1时,系统的JNI函数会对调用的参数进行更多的检查 同样的会增加资源消耗,降低执行效率 默认为0 设置方式: setprop

    7240

    再见,Android JNI 封装

    JNI 是啥、为啥要有 JNI ? Reference): 在函数返回后会被 JVM 自动释放掉,或者调用 (*env)->DeleteLocalRef(env, local_ref) 手动释放(「不管怎样」,尽量手动释放,防止局部引用表溢出,Android 5 JNI 库一键构建框架 支持 JNI Native 头文件自动生成 支持 JNI Library 生成 支持端到端,头文件生成->JNI 库生成 支持 Android APP 命令行编译(测试 JNI /javase/7/docs/technotes/guides/jni/spec/types.html#wp9502 https://developer.android.google.cn/studio /profile/memory-profiler#jni-references https://developer.android.google.cn/training/articles/perf-jni

    73210

    android JNI调用机制

    JNI是连接android Java部分和C/C++部分的纽带,完整使用JNI需要Java代码和C/C++代码。 JNI库放在 android系统的/system/lib/目录下;public nadd int nadd(int a, int b);为声明需要在java程序中使用的JNI库中的函数; JNI中java 部分的代码到此就结束了,总结一下在java代码中需要做两件事: 1)使用System.loadLibrary()函数来引用JNI库; 2)声明调用JNI库的函数且前面添加native关键字; android 使用JNINativeMethod将java调用的函数名与JNI实现的函数名联系在一起; 3)JNI函数实现; Android.mk代码: LOCAL_PATH := $(call my-dir)   adb push方法上传到android虚拟机的/system/lib/目录下; 2)java代码可以在eclipse下直接编译且在虚拟机上执行; 编译JNI C/C++部分代码(在android内核源代码根目录下

    77370

    Android JNI学习(二)——实战JNI之“hello world”

    头文件内容.png (七) 增加对应的.c文件 在工程main目录下创建一个名字为jni目录,然后将刚才的.h文件剪切过来。在jni目录下新建一个c文件。命名为ndkdemotest.c。 文件 同样在jni目录下,添加一个Android.mk文件,其目录结构如下: ? := ndkdemotest-jni LOCAL_SRC_FILES := ndkdemotest.c include $(BUILD_SHARED_LIBRARY) ? LOCAL_MODULE := ndkdemotest-jni:LOCAL_MODULE模块必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格。 /Android.mk' } } sourceSets.main { jni.srcDirs = []

    96342

    AndroidJNI与NDK

    (2)JNI 是属于 Java 的,与 Android 无直接关系 为什么要有 JNI 背景:实际使用中,Java 需要与 本地代码 进行交互 问题:因为 Java 具备跨平台的特点,所以Java 与 准备工作 Android Studio3.5,配置Gradle ,Gradle 版本我选择的是:com.android.tools.build:gradle:3.5.2 下载配置NDK,开发JNI 肯定需要 NDK的,这是前提,我选择了NDK版本android-ndk-r14b 安装配置JDK,Jdk至少要jdk7以上,我的是jdk8 JNI开始(这里使用的是 项目依赖库文件的形式,然后项目引用库文件) 接下来我们就需要在C文件是实现这些方法了 (4)jni文件夹下新建Android.mk和Application.mk文件,同时新建c文件,用来实现3步骤的头文件的接口方法 在jni文件夹下,new 弹框 选在ndk-build, 在Project Path 选在项目jni文件下自己的Android.mk 文件。 之后,会看到java文件的方法声明 有 C++的图标,C源文件有 Java图标。

    21110

    Android JNI 基础知识

    自从 Android Studio 升级到 2.3 版本以后,使用 CMake 进行编译就方便多了,不需要再写 Android.mk 了,也不需要用 javah 来生成头文件了,直接写好 native JNI 和 NDK 的区别 NDK 开发难免会搞不清 JNI 和 NDK 的区别。 JNI 全称是 Java Native Interface,即 Java 本地接口。 它本身和 Android 并无关系,只是在 Android 开发中会用到,在其他地方也会用到的。 NDK 是 Android 开发的工具包,主要用作 C/C++ 开发,提供了相关的动态库。 在 Android 上进行 NDK 开发还是得先学会 JNI 相关技能,先可以从 Java 层到 C/C++ 层的相互调用,然后再学习 NDK 开发的那些技巧。

    94230

    Android JNI出坑指南

    Android编程中,出于硬件交互,跨平台,安全性,第三方库等方面的考虑,我们需要Java与C/C++互相调用,这就需要借助Java平台的JNI接口(Java Native Interface)。 Android早期版本因JNI调用性能,native代码调试困难而被诟病,但近年来性能已经有不错的优化,Android NDK对C++开发支持也越来越好,特别是在Android Studio上开发调试C 然而JNI使用上还是有不少的坑和需要注意之处,特别是在多线程场景下使用JNI,不注意的话很容易出Bug。笔者结合自身经验、网上资料对JNI的坑进行总结,如果有不正确或遗漏之处欢迎指出。 Google官方JNI指南文档建议在Android2.0以上可使用pthread_key,在线程析构时自动调用Detach以简化操作。 //developer.android.com/training/articles/perf-jni.html ---- 如果您觉得我们的内容还不错,就请转发到朋友圈,和小伙伴一起分享吧~

    2.7K70

    Android系统源码分析-JNI

    Android平台,为了更方便开发者的使用和增强其功能性,Android提供了NDK来更方便开发者的开发。 2.为什么要有JNI? /jni -jni com.chenjensen.myapplication.MainActivity d :头文件输出目录 jni:生成jni文件 根据Javah生成的头文件,实现相应的native (register_com_android_internal_os_RuntimeInit), REG_JNI(register_android_os_SystemClock), REG_JNI (register_android_util_EventLog), REG_JNI(register_android_util_Log), ..... } array[i]是指gRegJNI 例如REG_JNI(register_com_android_internal_os_RuntimeInit).mProc也就是指进入register_com_android_internal_os_RuntimeInit

    55770

    Android JNI 之 Bitmap 操作

    Android 中通过 JNI 去操作 Bitmap。 在 Android 通过 JNI 去调用 Bitmap,通过 CMake 去编 so 动态链接库的话,需要添加 jnigraphics 图像库。 = 0, /** Bad parameter. */ ANDROID_BITMAP_RESULT_BAD_PARAMETER = -1, /** JNI exception occured. */ ANDROID_BITMAP_RESULT_JNI_EXCEPTION = -2, /** Allocation failed. * 首先创建一个新的 Bitmap 对象,参考之前文章中提到的方式:Android 通过 JNI 访问 Java 字段和方法调用。

    1.8K40

    Android JNI Crash定位步骤

    今天讲的是纯干货,目的就是为了指导Android开发者如何根据JNI Crash日志顺藤摸瓜,最后直捣黄龙定位磨人的JNI Crash。所以废话不多,直接开干吧。 1. 打蛇要打七寸,确定发生Crash的设备对应的CPU架构 在JNI Crash的日志里 如果有lib/arm, 则是armeabi-v7a架构; 如果有lib/arm64, 则是arm64-v8a架构 工欲善其事必先利其器,使用add2line 和ndk-stack等工具分析JNI Crash的log addr2line 作用是根据内存地址找到对应的报错代码的文件名和行号 所在目录是toolchain 的bin文件夹, 比如 aarch64-linux-android-4.9对应的bin文件夹是 /Android/Sdk/ndk-bundle/toolchains/aarch64-linux-android 所以如果遇到JNI方法找不到的错误,就可以使用该工具查看so库中的所有函数,然后搜索对应的JNI方法,看到底有没有被编译到动态库中。

    1.7K10

    Android JNI和NDK学习(03)--动态方式实现JNI

    package com.skywang.ndk; import android.app.Activity; import android.os.Bundle; import android.widget.TextView HelloLoad()是通过jni中注册到Android的方法,具体的实现在libndk_load.so中。 我们知道,系统初始化JNI在加载时,会调用JNI_OnLoad(),而卸载时会调用JNI_UnLoad();所以,我们可以通过重写JNI_OnLoad(),在JNI_OnLoad()中将函数注册到Android (03) 在jni目录下新建Android.mk,Android.mk的代码如下: ? 若命令执行失败,请先确保已经导入了ndk环境变量(请参考“Android JNI和NDK学习(01)--搭建NDK开发环境”)! 4 执行工程 以下是在平板上运行的实际效果图: ? 点击下载:源代码

    30320

    Android学习JNI,使用JNI实现字符串加密

    所以我们使用JNI学习如何使用C实现对字符串的加密。 首先:我们实现一个界面 布局文件就补贴出了。 ).toString(); et.setText(decodeFromC(passwd, passwd.length())); } 最后:实现本地方法 #include <jni.h >GetArrayLength(env,barr); //5:得到数据的首地址 jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE

    9410

    Android JNI 开发初体验(四)

    前言 我们都知道Java和C/C++不同 ,它不会直接编译成平台机器码,而是编译成虚拟机可以运行的Java字节码的.class文件,而Android底层的c/c++库。 1.使用Android Studio 创建Native C++工程 新建项目的时候有一个选项是选择Native C++的模板 [w9q35psrmt.png] 点击next,配置项目的信息 [bl6zdou83f.png CMakeLists.txt的相关配置如下: # For more information about using CMake with Android Studio, read the # documentation : https://d.android.com/studio/projects/add-native-code.html # Sets the minimum version of CMake required 因为C代码中的JNI函数不了解当前的JNI环境,JNIEnv实例应该作为第一个参数传递给每一个JNI函数调用者。

    77051

    相关产品

    • 直播 SDK

      直播 SDK

      直播 SDK 是腾讯云直播服务在移动场景的延伸,集成了腾讯云直播的推 / 拉流、主播观众互动连麦、主播跨房 PK 等能力,提供包括 iOS、Android、小程序、Web 等多种接入方式,为您提供针对移动场景的高质量直播服务,快速满足手机直播的需求。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券