JNI动态注册、静态注册实例及其实现原理分析

Android NDK--了解c语言 往期推荐 单机和弱联网游戏内购,白嫖的机会来了 AS+smalidea插件动态调式 JEB动态调试 Method Profiling 方法栈跟踪 前面一段时间主要分享了Java层的逆向分析,也分享完了,现在主要给大家分享Android NDK开发及相关的内容的知识,掌握Java层与Native层之间是如何进行通信的。 通过对C语言的了解,能够编写简单的C代码,并且能够将.c文件编译成可执行程序,放在Android设备上运行。 通过JNI接口可以实现Java层与底层C/C++函数进行相互调用。掌握JNI静态注 阅读详情


前言

想要彻底学好JVM需要一定C语言基础,要理解头文件、指针、结构体、结构体指针、函数指针、类型别名等概念,本文尽量通俗易懂的介绍JNI,语雀地址:https://www.yuque.com/yangxiaofei-vquku/wmp1zm/dmz2gd

一、什么是JNI

JNI全名Java Native Interface中文名java本地开发接口。通过JNI可以让java代码调用C或C++等底层语言,也可以用C或C++调用java语言,是java与其他语言交互的协议和桥梁,可以保证java代码的可移植性。

二、为什么要用JNI

当你无法用纯Java来实现需求的时候,就需要使用JNI来用底层语言编写的本地方法来满足这些该需求。列如:
当java库我发满足某些特殊平台的功能时。
已经用其他语言写好了库,不想重写编码想通过java代码直接调用时
希望实现一部分时间和性能要求都很高的逻辑,需要用底层语言来编写,如视频图片处理,游戏逻辑等。

三、怎么用JNI

1、JNI的静态注册

1)流程

  • 编写java代码调用Native方法sayHello()
    在这里插入图片描述

  • 使用javah -jni jvm.jni.StaticDemo 命令生成.h的头文件(在c语言中头文件可以理解问java中的interface接口)
    在这里插入图片描述

  • 使用C语言开发工具(我用的CLion)创建一个C语言工程并将新生成的.h文件copy到工程目录中,然后将jre/include/jni.h、jre/include/darwin/jni_md.h两个文件copy到C语言的工程目录中,最后创建jvm_jni_StaticDemo.c文件。

在这里插入图片描述
在这里插入图片描述

  • 在jvm_jni_StaticDemo.c文件中编写Java_jvm_jni_StaticDemo_sayHello()方法的实现逻辑
    在这里插入图片描述

  • 在CMakeLists.txt添加add_library(staticDemoLib SHARED jvm_jni_StaticDemo.h jvm_jni_StaticDemo.c)然后点击buildproject编译工程
    在这里插入图片描述

  • 编译完之后在make-build-debug文件夹下找到编译好的动态库文件libstaticDemoLib.dylib(mac为dylib,windows为dll,linux为so),将其放置在环境变量CLASSPATH的任意路径下都可以,本人放置在%JAVA_HOME%/lib的目录下(对应windows系统的%JAVA_HOME%/jre/bin目录)。
    在这里插入图片描述

在这里插入图片描述

  • 在java代码中添加静态代码块static{System.loadLibrary(“staticDemoLib”);}加载动态库,并运行代码
    在这里插入图片描述

2)原理

静态注册的原理是当加载动态库到jvm后当Native方法第一次执行时会根据其方法名去匹配对应的C语言实现命名规则解释可参考官方文档(我们无需手写,用javah命令生成即可)https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html#wp16696
在这里插入图片描述

JNI静态注册实现的缺点:

  1. 后期类名、文件名改动,头文件所有函数将失效,需要手动改,超级麻烦易出错
  2. 代码编写不方便,由于JNI层函数的名字必须遵循特定的格式,且名字特别长;
  3. 会导致程序员的工作量很大,因为必须为所有声明了native函数的java类编写JNI头文件;
  4. 程序运行效率低,因为初次调用native函数时需要根据根据函数名在JNI层中搜索对应的本地函数,然后建立对应关系,这个过程比较耗时。
    总结:缺点显而易见不推荐正式环境使用,只用于学习理解。

2、JNI的动态注册

1)流程

  • 编写java代码调用Native方法sayHello(),sayBye();
    -在这里插入图片描述

  • 创建DynamicDemo.c(任意命名)文件,并编写sayHello、sayBye的实现,添加JNI_OnLoad的实现

#include "jni.h"
/**
 *  sayHello方法的实现
 * @param jniEnv JNINativeInterface_结构体的二级指针对象里面包含了很多函数指针
 * @param jobject1 调用此方法的对象实例(即main方法中的dynamicDemo)
 * @return
 */
jstring fun1(JNIEnv *jniEnv, jobject jobject1){
    return (*jniEnv)->NewStringUTF(jniEnv,"我是Native方法sayHello的实现你好");
};
/**
 *  sayBye方法的实现
 * @param jniEnv  JNINativeInterface_结构体的二级指针对象里面包含了很多函数指针
 * @param jobject1 调用此方法的对象实例(即main方法中的dynamicDemo)
 * @return
 */
jstring fun2(JNIEnv *jniEnv, jobject jobject1){
    return (*jniEnv)->NewStringUTF(jniEnv,"我是Native方法sayBye的实现拜拜");
};
/**
 * 声明sayHello和sayBye的类路径
 */
static const char* mClassName="jvm/jni/DynamicDemo";

/**
 * JNINativeMethod结构体
 * 包含:name-方法名;signature-方法签名(描述返回值和入参);fnPtr-c中实现的函数指针
 * 方法签名可以根据javap命令反编译查看或使用jclasslib插件查看
 */
static const JNINativeMethod mMethod[]={
        {"sayHello","()Ljava/lang/String;",fun1},
        {"sayBye","()Ljava/lang/String;",fun2}
};

/**
 *  JNI_OnLoad方法实现
 *  在java中执行System.loadLibrary("dynamicDemoLib");时候加载完dynamicDemoLib动态库后会调用此方法
 * @param vm JNIInvokeInterface_结构体的二级指针(*vm是JNIInvokeInterface_的一级指针因为JavaVM本来就是个一级指针类型)
 * @param reserved
 * @return
 */
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved){
   JNIEnv* env= NULL;
   // 调用GetEnv函数获得JNIEnv指针
    int r=(*vm)->GetEnv(vm,(void**)&env,JNI_VERSION_1_8);
    if(r!=JNI_OK){
        return -1;
    }
    // 调用FindClass函数获取DynamicDemo的class的地址引用
    jclass mClass=(*env)->FindClass(env,mClassName);
    // 注册class与方法与JNINativeMethod的绑定关系,如果小于0则注册失败
    r=(*env)->RegisterNatives(env,mClass,mMethod,2);
    if(r!=JNI_OK){
        return -1;
    }
    return JNI_VERSION_1_8;
};
  • 在CMakeLists.txt添加add_library(dynamicDemoLib SHARED DynamicDemo.c)然后点击buildproject编译工程

在这里插入图片描述

  • 编译完之后在make-build-debug文件夹下找到编译好的动态库文件libdynamicDemoLib.dylib(mac为dylib,windows为dll,linux为so),将其放置在环境变量CLASSPATH的任意路径下都可以,本人放置在%JAVA_HOME%/lib的目录下(对应windows系统的%JAVA_HOME%/jre/bin目录)。
    在这里插入图片描述
    在这里插入图片描述

  • 在java代码中添加静态代码块static{System.loadLibrary(“dynamicDemoLib”);}加载动态库,并运行代码
    在这里插入图片描述

2)原理

动态注册的关键是JNINativeMethod结构体和JNI_OnLoad的实现,JNINativeMethod结构体包含:name-方法名;signature-方法签名(描述返回值和入参);fnPtr-c中实现的函数指针;JNI_OnLoad作用是绑定JNINativeMethod和class直接的关系并返回JNI的版本号。在执行JNI_OnLoad完成注册后当java代码中执行Native方法时根据调用类可以找对应JNINativeMethod再根据方法名和方法签名可以找到对应的C语言函数指针。
优点:
首次执行Native方法时即可根据映射关系直接获取对应的C函数指针,无需全局匹配
对C函数的实现类文件命名没有特殊要求,可以在一个文件里完成多个java文件中多个Native方法的实现和注册

3、jni.h中重要结构体介绍

这里介绍一下我们上面在静态注册和动态注册时用到的C语言的关键结构体

1)JNIEnv *jniEnv

在上面代码中JNIEnv *jniEnv多出现在实现函数的第一个参数,首先看下JNIEnv是什么呢?
在这里插入图片描述

上图是在jni.h里有对应别名声明,JNIEnv等同于JNINativeInterface_结构体即JNIEnv等同&JNINativeInterface_即JNIEnv为JNINativeInterface_结构体的一级指针,所以jniEnv为JNINativeInterface_结构体的一级指针,jniEnv为JNINativeInterface_结构体的二级指针。那JNINativeInterface_结构体又是什么呢?

struct JNINativeInterface_ {
    void *reserved0;
    void *reserved1;
    void *reserved2;

    void *reserved3;
    jint (JNICALL *GetVersion)(JNIEnv *env);

    jclass (JNICALL *DefineClass)
      (JNIEnv *env, const char *name, jobject loader, const jbyte *buf,
       jsize len);
    jclass (JNICALL *FindClass)
      (JNIEnv *env, const char *name);

    jmethodID (JNICALL *FromReflectedMethod)
      (JNIEnv *env, jobject method);
    jfieldID (JNICALL *FromReflectedField)
      (JNIEnv *env, jobject field);

    jobject (JNICALL *ToReflectedMethod)
      (JNIEnv *env, jclass cls, jmethodID methodID, jboolean isStatic);

    jclass (JNICALL *GetSuperclass)
      (JNIEnv *env, jclass sub);
    jboolean (JNICALL *IsAssignableFrom)
      (JNIEnv *env, jclass sub, jclass sup);

    jobject (JNICALL *ToReflectedField)
      (JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic);

    jint (JNICALL *Throw)
      (JNIEnv *env, jthrowable obj);
    jint (JNICALL *ThrowNew)
      (JNIEnv *env, jclass clazz, const char *msg);
    jthrowable (JNICALL *ExceptionOccurred)
      (JNIEnv *env);
    void (JNICALL *ExceptionDescribe)
      (JNIEnv *env);
    void (JNICALL *ExceptionClear)
      (JNIEnv *env);
    void (JNICALL *FatalError)
      (JNIEnv *env, const char *msg);

    jint (JNICALL *PushLocalFrame)
      (JNIEnv *env, jint capacity);
    jobject (JNICALL *PopLocalFrame)
      (JNIEnv *env, jobject result);
 ...省了很多函数

上段代码为JNINativeInterface_在jni.h中的声明,JNINativeInterface_结构体为一个函数表,里面包含了JNI官方提供的常用函数的函数指针,方便我们直接调用。
在这里插入图片描述
上图是JNIEnv*的结构图,JNIEnv是线程唯一的一个线程只有一个JNIEnv,而且不可跨线程调用。

2)JavaVM *vm

在这里插入图片描述

struct JNIInvokeInterface_ {
    void *reserved0;
    void *reserved1;
    void *reserved2;

    jint (JNICALL *DestroyJavaVM)(JavaVM *vm);

    jint (JNICALL *AttachCurrentThread)(JavaVM *vm, void **penv, void *args);

    jint (JNICALL *DetachCurrentThread)(JavaVM *vm);

    jint (JNICALL *GetEnv)(JavaVM *vm, void **penv, jint version);

    jint (JNICALL *AttachCurrentThreadAsDaemon)(JavaVM *vm, void **penv, void *args);
};

同JNIEnv的解释一样直接vm是JNIInvokeInterface_结构体的二级指针,JNIInvokeInterface_也是个函数表包含了五个函数指针,它是虚拟机在JNI层的代表。调用JavaVM的GetEnv函数可以注册JNIEnv;调用JavaVM的AttachCurrentThread函数,就可得到这个线程的JNIEnv结构体;另外,后台线程退出前,需要调用JavaVM的DetachCurrentThread函数来释放对应的资源。

3)JNINativeMethod

在这里插入图片描述

JNINativeMethod是一个结构体包含:name-方法名;signature-方法签名(描述返回值和入参);fnPtr-c中实现的函数指针;作用是用来注册和记录Native方法与C语言实现函数指针直接的关系。

4、基于OpenJDK分析JNI的动态库的加载流程

细心的同学应该发现了我们只是将C语言编译后的动态库放入%JAVA_HOME%/lib(对应windows系统的%JAVA_HOME%/jre/bin目录)的目录下jvm并不会加载此动态库,如果想要加载需要在java显示执行System.loadLibrary(“动态库名”)才行,那么现在就来看下这行代码究竟干了什么。
注:并不是只有我们自己编译的动态库才需要显示执行System.loadLibrary(),JDK自带在%JAVA_HOME%/lib(对应windows系统的%JAVA_HOME%/jre/bin目录)下面的动态库也需要显示执行System.loadLibrary()才会被加载。

以linux平台为例,简单总结一下整个so库的加载流程:

①. 首先 System.loadLibrary() 被调用,开始整个加载过程。

②. 其中调用 ClassLoader 对象来完成主要工作,将每个本地库封装成 NativeLibrary 对象,并以静态变量存到已经加载过的栈中。

③. 执行NativeLibrary 类的 load native方法,来交给native层去指向具体的加载工作。

④. native层 ClassLoader.c 中的 Java_java_lang_ClassLoader_00024NativeLibrary_load 函数被调用。

⑤. 在native load函数中首先使用 dlopen 来加载so本地库文件,并将返回的handle保存到 NativeLibrary对象中。

⑥. 接着查找已经加载的so本地库中的 JNI_OnLoad 函数,并执行它。

⑦. 整个so本地库的加载流程完毕。

当native方法执行时会先尝试按照动态注册执行方式根据调研class查找对于的JNINativeMethod结构体,如果找不到则会按照静态注册执行方式根据方法名与类库中匹配函数,匹配到后会动态维护JNINativeMethod结构体。

基于OpenJDK分析JNI的动态库的加载流程部分参考:https://www.jianshu.com/p/fdf50516faa8

Android深入理解JNI(一)JNI原理与静态、动态注册 JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在Java Framework层。这一个系列我们来一起深入学习JNI。 阅读详情

相关推荐

JNI方法注册源码分析(JNI_OnLoad|动态注册|静态注册|方法替换)

文章指在学会使用JNI方法动态注册,静态注册,方法替换,且在这个过程中稍微了解一下`native`层的动态库加载,方法加载等知识。

stven_king的专栏 2827

NDK(五):JNI静态注册与动态注册

我们知道,JNI是Java层与Native层的桥梁,可以通过 JNI层实现Java层与Native层的互调。那么JNI是如何将 Java方法与 Native方法关联起来的呢?

Elson的博客 2197

Android系统的JNI原理分析(1)- JNI的静态注册和动态注册

当在Java中调用init_native方法时,Java虚拟机就会去JNI中寻找Java_com_example_myapplication_MediaRecorder_native_1init函数,如果没找到会报错,如果找到了就会为这两者建立关联(通过保存JNI的函数指针,这样在下次调用native_init方法时直接使用这个函数指针即可)进入到源码路径:vim ~/LineageOS/frameworks/base/media/jni/android_media_MediaRecorder.cpp。

Android系统工程师--小馬佩德罗 1万+

Android JNI静态注册和动态注册方法详解

这里的JNI静态方式注册方法和JNI的static方法是没有关系的。本文主要介绍jni.cpp代码中动态注册方法的讲解。很多人对这块知识还是比较陌生的,什么是静态注册?什么是动态注册?有些人可能都不清楚。JNI静态注册和动态注册是哪里的代码?什么时候使用静态注册?什么时候使用动态注册?为什么呢?其实一般情况用不到动态注册,但是复杂JNI项目或者系统源码中可能会用到动态注册。特别是系统源码中基本都是用的动态注册的形式,注册JNI方法,所以是有必要进行学习的。

wenzhi的博客 3077

STM32F103ZET6驱动57闭环步进电机(连线+代码)

一、设备: 1. STM32F103开发板 (普中F103的板子) 2. 57闭环电机带驱动 3. 24V/3A的直流电源,用于给电机驱动供电 简单说明:使用Keil5编程,主要使用了PWM波,外部中断和时间中断,按键控制电机使能和脱机并且控制PWM的周期,调节周期即调节电机的转速。 二、STM32开发板与电机驱动的连线: 1.PUL-、ENA-、DIR-与STM32的连接方法: 可以参考CSND的这个链接中的说明,使用共阴极接法:STM32F407-用TB6600驱动器驱动57步进电机(代码

baidu_39071234的博客 7428

OpenHarmony v4.1 Release设置应用随系统自动启动

OpenHarmony 4.1 版本中的 Ability Manager Service (AMS) 提供了应用自启动管理功能,允许系统控制哪些应用可以在系统启动时自动运行。这需要以下两个主要步骤:启用系统的自启动管理支持开发一个系统应用来管理自启动配置。

afufufufu的博客 1898

JNI开发

静态注册是指通过JNI生成的头文件中的函数名称来实现Java方法与本地实现的绑定。函数名称遵循特定的命名规则,以确保Java虚拟机能够正确地找到对应的本地实现。动态注册允许开发者在本地库加载时,以编程的方式将Java方法与本地实现关联。与静态注册不同,动态注册不要求本地函数名遵循特定命名规则。在JNI中,方法签名是用于描述Java方法参数和返回类型的字符串,与Java通信则包括调用Java方法、访问Java字段、处理Java数组、异常处理和字符串操作等方面。

qq_34358193的博客 915

高项49个过程,输入、工具技术、输出的思维导图

为了制定项目章程的管理方法主要是采用了数据收集技术,例如通过头脑风暴,通过召集主题专家和团队成员收集信息、解决方案,并在短时间内获得大量创意,并对大量创意进行分析和排序,选出最优化最适合本项目方案,并对项目成员的不同差异观点,进行了引导和对冲突的管理,最终有助于项目干系人的目标、成功标准的内容达成一致意见,形成完善的项目章程。在本过程中得到项目章程,在制定项目章程中需要包括信息有:项目名称、项目目标、项目总里程碑进度表、项目经理、主要干系人及财务预算信息。本过程在仅开展一次,或仅在项目的预定义点开展。

Legend_Jiang的博客 6177

安卓逆向_6 --- ndk开发jni、jni静态注册、jni_onload动态注册

JNI 全称是Java Native Interface,为Java本地接口,并提供了若干的 API 连接Java层与Native层。JNI 相当于一个桥梁,实现了 Java 和 C++ 之间互相访问调用。 在 Android 进行 JNI 开发时,可能会遇到 couldn't find "xxx.so" 问题,或者内存泄漏问题,或者JNI 底层崩溃问题。Java 层如何调用 Native 方法?Java 方法的参数如何传递给 Native层?而 Native 层又如何反射调用 Java 方法

freeking101的博客 4742

STM32F4用FSMC驱动AX58100 EtherCAT从站芯片,保姆级配置流程与避坑指南

本文详细介绍了STM32F4通过FSMC接口驱动AX58100 EtherCAT从站芯片的完整配置流程,包括硬件连接、时序优化、协议栈移植及TwinCAT主站集成。针对工业自动化场景,提供高性价比的实时控制解决方案,特别适合机械臂、CNC机床等精确同步应用,并分享关键调试技巧与性能优化方法。

weixin_27869497的博客 305

微信小程序PC端兼容性实战:如何绕过限制在电脑上运行手机端小程序

本文详细解析了微信小程序在PC端的兼容性问题及解决方案,重点介绍了如何利用`wx.getSystemInfo`API检测运行环境,并通过修改User-Agent、动态环境检测与适配等技术手段实现手机端小程序在PC端的顺畅运行。文章还提供了常见兼容性问题的解决方法和调试工具推荐,帮助开发者高效应对多端适配挑战。

weixin_28366053的博客 861

JNI查找 native 方法的规则(静态、动态注册)

转载自:JNI查找 native 方法的规则通过上一篇文章,大家明白了调用 native 方法之前,首先要调用 System.loadLibrary 接口加载一个实现了native 方法的动态库才能正常访问,否则就会抛出 java.lang.UnsatisfiedLinkError 异常,找不到 XX 方法的提示。现在我们想想,在 Java 中调用某个 native 方法时,JVM 是通过什么方式...

lzf的博客 4931

最新扣子(coze)案例:在coze上用DeepSeek+私有数据库、知识库,创建你的专属智能体

Gartner预测,到2026年,70%的企业将通过Al知识库实现「组织记忆外化」。数字化时代,数据已成为企业发展的核心资产。我们通过人工智能将知识库从“静态存储"升级为“智能服务”。让"沉睡宝藏"焕发新生,助力企业突破数据困局。

weixin_72689845的博客 2163

JNI注册调用流程

不依赖函数名匹配规则,而是在 Native 代码中手动调用 JNI API,将 Java 的 native 方法与实际的 C/C++ 函数进行手动映射(注册),更加灵活、可控,性能也稍优。3.这个绑定是通过一个 JNI 注册函数完成的,通常在:frameworks/base/core/jni/android_os_SystemProperties.cpp。2.动态注册,方法名可以自定义,然后将对应的java的native 方法与 C/C++ 函数进行绑定,然后在在 JNI_OnLoad()完成注册。

HZUST的博客 738

机器人中的数值优化(十三)——QP二次规划

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例

慕羽★的博客 2792

Android Studio无法启动,Failed to create JVM:error code -1. JVM Path 完美解决方案

Android Studio无法启动,Failed to create JVM:error code -1. JVM Path 完美解决方案。 找到Android studio的启动文件bin目录,把studio64.exe.vmoptions 删除或改名(推荐改名,方便恢复),如果你是32位系统这个文件就是 studio.exe.vmoptions

陈万洲的专栏 4847

深入理解Android(5)——从MediaScanner分析Android中的JNI

前面几篇介绍了Android中的JNI和基本用法,这一篇我们通过分析Android源代码中的JNI实例,来对JNI部分做一个总结。一、通向两个不同世界的桥梁在前面我们说过,JNI就像一个桥梁,将Java和Native世界紧密的联系在了一起,在Android平台上如果没有Native层的支持我们的系统寸步难行,甚至Java中的虚拟机也是通过Native实现的。二、MediaScanner类的简单介绍

水寒 4078

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Android基础——JNI机制

通过使用jni实现java和C/C++的互相调用

weixin_44901971的博客 1068

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JNI 静态注册与动态注册

静态注册 原理:根据函数名来建立 java 方法与 JNI 函数的一一对应关系; 实现流程: 编写 java 代码; 利用 javah 指令生成对应的 .h 文件; 对 .h 中的声明进行实现; 弊端: 编写不方便,JNI 方法名字必须遵循规则且名字很长; 编写过程步骤多,不方便; 程序运行效率低,因为初次调用native函数时需要根据根据函数名在JNI层中搜索对应的本地函数,然后...

efan的博客 6357

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android:JNI 动态注册和静态注册的详解(附android studio实例)

Android:JNI 动态注册和静态注册的详解 一、JNI是什么? JNI是Java Native Interface的缩写,中文名为JAVA本地调用。它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。Java是支持调用...

海月汐辰 6024

JNI/NDK入门指南之JNI动/静态注册全分析

      JNI/NDK开发指南之JNI动/静态注册全分析   在前面的章节里面我们主要讲解了JNI开发中的一些基本语法知识,并且在JNI/NDK开发指南之Eclipse集成NDK开发环境并使用中简单通过一个实例说明了NDK开发JNI流程。那么读者朋友们,是否有过这么一个疑问JNI中的虚拟机怎么知道我们使用Java中的Native方法时,具体调用到JNI Native中的那个函数呢。这个就是本篇...

IT先森 2011

安卓JNI静态注册和动态注册的区别

Android:JNI 动态注册和静态注册的详解 一、JNI是什么? JNI是Java Native Interface的缩写,中文名为JAVA本地调用。它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。Java是支持调用C/C++代码的,不过不能直接调用,因此需要一个中间层来进行转换、翻译,这就是JNI(Java Native Interface)的意思,JNI的作用就是粘合Java代码和C+

抚琴 1439

JNI 动态注册和静态注册的详解

对于未知的技术我们心里总是比较忐忑,但是当你攻下这个技术领域的时候又是一种满满的收获,坚持探索----------Bill 2019.04.08 本博文采用问答的方式讲解JNI的动态注册和静态注册的方式 1. 什么是JNI? JNI的英文缩写是 java nativie interface ,按照字面解释就是java 本地接口。什么样的接口才叫nativi...

肖岩 2817

JNI 原理与静态、动态注册

除了性能的之外,最主要的原因就是在Java诞生之前,就有很多程序和库都是由Native语言写的,因此,重复利用这些Native语言编写的库是十分必要的,况且Native语言编写的库具有更好的性能。其中JNIEnv指代的是当前java环境,可以利用JNIEnv可以操作java层代码;在JNI_OnLoad函数的结尾处,我们一定要有返回值,而且必须是JNI_VERSION_1_4或JNI_VERSION_1_6,也就是JNI的版本号,我们一定要返回正确的版本号,否则系统也是无法加载的。.........

因热爱而执着,因执着而成功。 582

Android 实现JNI动态注册

Android 实现JNI的动态注册前景什么是静态注册静态注册的优缺点优点缺点什么是动态注册实现创建步骤用到的方法结束 前景 JNI可以说是Java 和Native 的桥梁 起承上启下的作用,没有JNI Android就只能访问到Java 的Framework层,在想深入可谓是举步维艰. 什么是静态注册 静态注册就是根据函数名来建立Java函数与JNI函数一一对应的关系 JNI函数名的规则:Java_包名_类名_函数名,也就是以这种规则来确认JNI函数与某个类Java函数的对应关系 在Java加载so库的时

qq_41740162的博客 2472
上一篇: JVM体系结构篇之JVM的指令集架构模型
下一篇: 类加载时JVM在搞什么?JVM源码分析+OOP-KLASS模型分析
躺平程序猿
博客等级 码龄8年 4870粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

躺平程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值