首页
学习
活动
专区
圈层
工具
发布

JNI 解析以及在 Android 中的实际应用

1 简述 JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(在Android里面主要是C&C++)。...、JNI对于Android安全以及Android安全加固等都是有所帮助的,一般情况下,在Android应用层,大部分时间都是在使用Java编程,很少使用C/C++编程,在一些比较特殊的情况下会用到,比如加密等等...2 如何使用 在目前的Android开发中,一般情况下有2种方法来使用JNI编程,就是传统的需要手动生成h文件和新版的CMake,Cmake的是利用配置文件来完成一些配置,实际上只是简化了流程,用CMakeLists.txt...,步骤跟Java层的是一样的,换句话说在Java反射能做到的,在JNI中通过类似的反射也是可以做到的,这些方法原型在jni.h文件里面,比如 大家可以多去看看那些方法,基本上各种类型的方法都有,运行如下...4 JNI在Android中的实际应用 前面说了,JNI在整个Android系统中发挥了重要的作用,是连接底层和框架层的桥梁,在Android源码中更是大量的JNI代码,我们来说一个实际的例子:获取签名并且校验签名

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

    JNI基础

    目录,引入头文件,根据头文件实现c代码 编写Android.mk文件 Ndk编译生成动态库 Java代码load 动态库.调用native代码 ###JNI开发之Java中调用C代码步骤 在java中定义一个要调用的...C的方法(本地方法) //1.定义一个native的方法 public native String helloFromC(); 在工程中新建一个jni文件夹(然后在这个文件夹中写c代码,在C中实现...java里面定义的c方法默认的时候是自己手写c的方法名, 但是很麻烦这里要参考七里面提供的方式,用javah编译后,然后拷贝h的头文件到jni文件夹中,在从h文件拷贝方法的名字,然后实现该方法)....C调用java的 思想类似于java中的反射,我们在c中就是通过反射的c实现来找到java中的这个方法, 在getMethodID的第二个参数是一个方法的签名,这里我们可以通过jdk提供的一个工具javap...java虚拟机中的,而是运行在虚拟机之外的一个单独的进程中 自定义一个View控件(用于表示锅炉的压力大小) 写一个类继承View(View是Android中所有能显示到界面上的东西全的父类

    1.6K100

    android JNI调用机制

    JNI是JVM实现中的一部分,因此Native语言和Java代码都运行在JVM的宿主环境。...此外,在JNI应用中,Java代码与Native代 码运行于同一个进程空间内;对于跨进程甚至跨宿主环境的Java与Native间通信的需求,可以考虑采用socket、Web Service等IPC通信机制来实现...在Java中,创建一个新对象只需要使用new 关键字即可,但在Native代码中创建一个对象则需要两步:首先通过JNI接口GetMethodID得到该类的构造函数,然后利用NewObject接口构造出该类的一个实例对象...使用JNINativeMethod将java调用的函数名与JNI实现的函数名联系在一起; 3)JNI函数实现; Android.mk代码: LOCAL_PATH := $(call my-dir)  ...adb push方法上传到android虚拟机的/system/lib/目录下; 2)java代码可以在eclipse下直接编译且在虚拟机上执行; 编译JNI C/C++部分代码(在android内核源代码根目录下

    2K70

    【Android从零单排系列四十五】《Android中自定义View的实现方法》

    前言 小伙伴们,在前面的几篇文章中,我们谈到了Android开发中的几种数据存储方式及数据持久化以及数据权限相关的内容,本文我们介绍下Android开发中的另一部分内容,自定义View。...一.Android 自定义view的概念 在Android中,自定义视图(Custom View)是指开发者可以根据自己的需求和创意创建全新的用户界面组件。...实现复杂的绘制操作:自定义视图类中的onDraw()方法允许您使用Canvas对象进行绘制操作,例如绘制图形、文本、位图等,从而创建出独特的UI元素。...二  Android 自定义view的方法 创建一个继承自View或其子类的Java类作为您的自定义视图类。...="wrap_content" /> 接下来,您可以在CustomView类中重写onDraw()方法来实现具体的绘制逻辑。

    70820

    【Android 应用开发】Android 开发 之 JNI入门 - NDK从入门到精通

    , 这些函数在jni.h中进行定义; -- JNI方法 : Native方法对应的JNI层实现的 C/C++方法, 即在jni目录中实现的那些C语言代码; 2....编程模型; -- 应用框架层 : 使用的是Android中自定义的一套JNI编程模型, 该自定义的JNI编程模型弥补了标准JNI编程模型的不足; Android中JNI源码位置 : 在应用框架层中, 主要的..., 主要用于Android的JNI开发; -- JNI : JNI是一套编程接口, 用来实现Java代码与本地的C/C++代码进行交互; JNI编程步骤:  -- 声明native方法 : 在Java代码中声明...native method()方法; -- 实现JNI的C/C++方法 : 在JNI层实现Java中声明的native方法, 这里使用javah工具生成带方法签名的头文件, 该JNI层的C/C++代码将被编译成动态库...native方法, 不用实现方法体, 可以直接调用; Log.java在Android源码中的位置 : \frameworks\base\core\java\android\util\Log.java

    3.7K11

    Android JNI学习(三)——Java与Native相互调用

    具体的实现很简单,首先在Java代码中声明native函数,然后通过javah来生成native函数的具体形式,接下来在JNI代码中实现这些函数即可。...同时也可以在该函数中做一些初始化的动作,其实这个函数有点类似于Android中的Activity中的onCreate()方法。..."); } } 在jni中的实现 jint JNI_OnLoad(JavaVM* vm, void* reserved) 并且在这个函数里面去动态的注册native方法,完整的参考代码如下...上面讲解了如何从JNI中调用Java类中的方法,其实在jni.h中已经定义了一系列函数来实现这一目的,下面我们就以此举例说明: (一)、获取Class对象 为了能够在C/C++中调用Java中的类,jni.h...所以为了在C/C++获取Java层的属性和方法,JNI在jni.h头文件中定义了jfieldID和jmethodID这两种类型来分别代表Java端的属性和方法。

    3.4K40

    JNI开发总结

    /archive/2013/05/23/3092491.html JNI中C调用java的方法:http://www.cnblogs.com/xitang/p/4174619.html JNI读取应用签名...这篇文章主要介绍JNI开发中遇到的坑以及解决的方法。 ? ---- ? 一.静态注册和动态注册 为什么需要注册?其实就是给Java的native函数找到底层C,C++实现的函数指针。...1.必须遵循某些规则 2.名字过长 3,多个class需Javah多遍, 4.运行时去找效率不高 动态注册 : 在JNi层实现的,JAVA层不需要关心,因为在system.load时就会去掉JNI_OnLoad...二.C反射JAVA 的各种方法 TestClass类包一个构造方法、一个成员方法,一个静态方法,一个内部类,大多数的类都是由这三种方法组成的。下面要做的就是怎么在JNI调用这些方法。...(env, innerobject, setInt, 2); } 此处需要注意 在C中: (*env)->方法名(env,参数列表) 在C++中: env->方法名(参数列表) ?

    1.8K41

    NDK开发(三) :JNI访问Java变量和方法

    转载请以链接形式标明出处: 本文出自:103style的博客 本文操作以 Android Studio 3.4.2 版本为例 NDK开发(一) :NDK入门指南 NDK开发(二) :JNI的数据类型...NDK开发(三) :JNI访问Java变量和方法 NDK开发(四) :JNI操作Java数组 NDK开发(五) :JNI实现文件加解密 NDK开发(六) :JNI实现文件拆分和合并 前先阅读 JNI的数据类型...(); 选中accessField,按 Alt+Enter快捷添加.cpp中方法Java_com_example_myapplication_MainActivity_accessField 在方法中实现修改属性的逻辑...JNI获取类的方法的ID调用GetMethodID获取,通过Call[类型]Method调用方法。...JNI获取类的构造方法的ID调用GetMethodID获取,通过NewObject构造,构造函数名为""。

    54920

    Android NDK编程(四)--- CC++调用Java中的方法

    前言 上一篇我们介绍了《Android NDK编程(三)--- Android调用C的函数》,主要是介绍了在Android中怎么调用C/C++中的方法,在我们开发ndk的时候有可能会用到在c/c++代码中回调...JAVA中的方法,这一章我们就来介绍一下C/C++中怎么调用Android中的方法。...调Java方法 代码演示之前,这里要重点说出一下C/C++调用JAVA的方法步骤: Android中Jni可以通过FindClass,GetMethodID, CallObjectMethod等可以实现对...GetMethodID中最后一个参数的写法很特殊, Jni中GetMethodID的定义: jmethodID GetMethodID(jclass clazz, const char* name, const...char* sig) 第一个参数:JNI接口对象; 第二个参数:Java类对象; 第三个参数:参数名(或方法名); 第四个参数:该参数(或方法)的签名。

    2.3K20

    让JNI告诉你 你的应用为什么被卸载

    一  这篇文章你可以学到什么 1.Java语言如何调用C代码,以C语言验证用户名和密码为例 2.C语言如何调用Java代码,以C语言调用Java方法为例 3.如何使用C语言,实现简单实用的功能,以APP...这样我们就可以在JNI类中,加载这个库 static { System.loadLibrary("checkuser"); } 在C代码中我们已经得到了name和pass const char...(JNIEnv *env, jobject) { return (env)->NewStringUTF("huanglinqing"); } 我们要调用的java方法在JNI类中,想想java...可以通过反射来调用另一个类的方法,那么C其实也是通过反射的,首先我们定义要调用方法的路径,JNI类全路径为jnidemo.hlq.com.jnidemo.JNI,在C中将.替换为/ const char...android.intent.action.VIEW,打开百度的网址 当然,我自己在测试的时候,可以完美运行的只有一个4.0的3G手机,其他高版本手机也是无济于事。

    62540

    Android CameraX NDK OpenCV(四)-- 二维码检测与识别

    前言 OpenCV在4的版本后就有了二维码QRCode的检测和识别功能,当时刚出的时候效率及识别效果都还一般,在4.1.2的版本中也改善了精度和速度,然后后面4.3版本中的更新又加入了多个二维码检测的函数...《Android NDK编程(七)--- JNI中List结构的类数据返回》文章中有简单的介绍过返回实体类的方式,在这里我们就用到了从JNI中返回列表实体的实现。 01 定义实体类 ?...在OpenCVJNI的类中加入了qrCodeDetector的检测函数,传入的方式和前面的基本一样,返回值为List。 03 C++中实现 ?...Object;)Z"); //定义实例化Point的方法 jclass pt_cls = env->FindClass("android/graphics/PointF")...code {nMatToBitmap}"); }} 方法的代码挺多,主要是调用JAVA中的类,动态创意List,再ADD添加实体,因为本身返回的List中的还嵌套着一个List,

    1.7K40

    Android CameraX NDK OpenCV(二)-- 实现Dnn人脸检测

    前言 上一篇《Android CameraX NDK OpenCV(一)--实时灰度图预览》已经把Android下OpenCV的Ndk配置完成,并且实现了实时灰度图的显示,本篇来看看在Android下使用...Dnn的人脸检测在《实践|OpenCV4.2使用DNN进行人脸检测二(视频篇)》文章中已经实现过,不过那个是在Windows平台下的,检测的方式基本就是按那个来的,这次是我们把其的部分代码移植了过来。...VIEW,在VIEW中进行绘制的,其实如果不要想这个情况,可以像灰度图显示一样,把整张已经标记好的图片都传回来,然后DrawBitmap把原来的预览图盖住也可以。...还要注意的一点是加载的人脸检测的模型文件,因为要在NDK中加载并初始化,所以在程序中我们要考虑怎么拷模型文件先复制到Android设备本地,然后调用JNI的方法去加载模型文件。 代码部分 ?...在ViewOverLay的类中加入一个DrawRect的方法,因为在JNI返回的是人脸检测到的矩形,所以这里加入一个画矩形的函数,后面两个参数的宽度和高度在上一篇灰度显示中提到过,我们传入的图片的大小和预览的图片大小不一致

    2K40

    android中怎么在View构造的attrs中拿到android给的属性以及attrs属性介绍

    一、 首先要在res/values目录下建立一个attrs.xml(名字可以自己定义)的文件,并在此文件中增加对控件的属性的定义.其xml文件如下所示: 中定义的,自定义属性的Value值可以有10种类型以及其类型的组合值,其具体使用方法如下: 1. reference:参考某一资源ID。.../> 二、接下来实现自定义View的类,其中下面的构造方法是重点,在代码中获取自定义属性,其代码如下: package com.example.CustomAttr; import android.content.Context...布局中引用自定义View控件,其XML代码如下: ?...该例子中只是起到抛砖引玉的作用,你可以自定义其他属性,来实现你想要的自定义View效果。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    1.6K110

    Android SurfaceVeiw划矩形截屏存放到RecyclerView中

    前一篇文章《Android SurfaceView onTouchEvent进阶操作OpenCV显示》我们已经实现了在SurfaceView中划矩形显示在源图上,本章我们将结合前几天学习的东西把划的图形保存到...★ 知识点 ★ 01 RecyclerView的应用《Android RecyclerView图片横向滚动显示》 02 OpenCV NDK的使用《Android NDK编程(七)--- JNI中List...在MainActivity中定义与RecyclerView相关的参数,然后写了一个初始化的RecyclerView的方法。...nv21ToBitmap的方法中我们重新写了一个调用的JNI,返回的List集合,其中第一张为我们的原图,第二张是我们截取出来的图,然后把第二张图在回调函数中加入发送过去。...04 JNI相关 JNI中加入返回List的方法 ?

    1.4K30

    Android Studio2.2下NDK开发初试

    += -DSTDC_HEADERS 下一步,需要在app的build.gradle中说明ndk-build的mk文件在哪里,在android范围内添加 externalNativeBuild {...,如: public static native String getHelloString(); 接着,Android Studio可以帮助我们构建hello-jni.c文件,在错误的地方,alt+...,所有准备工作都已经完事了,需要注意的是,c代码中的函数名相信很多人都已经发现了,和我们在java代码中声明的native不同,长了一大串,它的格式其实是 JNIEXPORT 返回值类型 JNICALL...首先,我们需要获取java中函数的methodID,例如我这里是获取设置进度条进度的方法,先获取方法所在jclass,需要注意的是,这里FindClass中第二个参数classname需要完整的类名,因此需要包名...(*env)->CallXXXMethod,如下 (*env)->CallVoidMethod(env, instance, progressMethod, total); 还有,在JNI的c代码中需要注意

    1.1K50

    ​FFmpeg 开发(15):学习如何使用 FFmpeg 打造一个自己的通用播放器?

    前面 FFmpeg 系列的文章中,已经实现了 FFmpeg 的编译和集成,基于 FFmpeg 实现音视频的播放、录制,并结合 OpenGL 添加丰富的滤镜等功能,这些 demo 基本上将 FFmpeg...项目地址:https://github.com/rockcarry/fanplayer fanplayer 是一个基于 FFmpeg 实现的支持 Android 和 Windows 平台的通用播放器,支持硬解码...JNI 入口函数定义在文件 fanplayer_jni.cpp ,定义了几个播放器常用的 API: static const JNINativeMethod g_methods[] = { {...文件 adev-android.cpp ,音频播放是通过 JNI 创建了 AudioTrack 对象,开启了一个子线程不断地从保存 PCM 数据的队列(链表)中读取数据: // 接口函数实现 void*...,视频渲染走的是 ffrender.c 的 render_video ,然后调用 vdev-android.cpp 中的 vdev_android_lock: static void vdev_android_lock

    1.3K20
    领券