您当前的位置:钢材 > 型钢 > 市场分析

native和local的区别,nat的作用

来源:头条 作者: chanong
分享到
关注德勤钢铁网在线:
  • 扫描二维码

    关注√

    德勤钢铁网微信

在线咨询:
  • 扫描或点击关注德勤钢铁网在线客服

什么是JNI? JNI 代表Java 本机接口。使用Java 本机接口编写程序可以更轻松地将代码移植到不同的平台。从Java 1.1 开始,JNI 标准成为Java 平台的一部分。这允许您使用Java 代码之类的东西。本地代码和Java 虚拟机通过JNI 函数与用该语言编写的代码进行交互。 JNI函数是通过接口指针获取的,本地方法以JNI接口指针作为参数。 虚拟机保证从同一个Java 线程上多次调用本地方法时,传递给本地方法的接口指针是相同的JNI 接口指针本地方法被不同的Java 线程调用时使用JNI,您接受各种JNI接口指针并使用JNI与您的算法进行交互,主要是为了提高算法的性能并最大限度地利用您机器的硬件资源。

Android的语言层分为Java层和native层,为什么会有native层呢?这是因为在Java之前,很多功能和系统都是用原生语言编写的,Java出现之后,就不需要重新发明轮子了,你可以直接调用这些方法,并且原生层更接近。转换为汇编语言,从而提高性能。你会在你的代码中看到Java层调用native层的方法,但是这个跨语言的调用过程就是JNI。如果您有无法使用Java 语言处理的任务,您可以使用JNI 来:请完成它。

JNI 的应用场景如下: 需要调用一些Java 语言不支持的函数,依赖于操作系统平台的能力; 需要调用当前UNIX 系统上的某些函数。 Java 不支持,必须使用JNI 如果你的程序对时间敏感或者性能要求特别高,为了提高运行效率,应该使用低级语言 音视频开发相关的音视频编解码器要求更快需要使用JNI 集成Java 语言开发的系统 需要使用以前实现的一些C/C++ 语言开发的功能或系统新版本将这些功能集成到当前系统中JNI 是一个使Java 更加全面,提高Java 封装各个平台差异的能力的重要一步。

JNI异常处理在Android NDK开发过程中,调用Java对象方法可能会抛出异常。如果NDK层不做任何事情,程序会直接崩溃。例如,如果您想对APK 进行签名。 JNI层的代码如下:

**jclassnative_class=env-GetObjectClass(const_cast(contextObject)); jmethodID pm_id=env-GetMethodID(native_class, 'getPackageManager', '()Landroid/content/pm/PackageManager;'); jobject pm_obj=env-CallObjectMethod(const_cast) (contextObject), pm_id); jclass pm_clazz=env-GetObjectClass(pm_obj); jmethodID package_info_id=env-GetMethodID(pm_clazz, 'getPackageInfo','(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;') ; //获取应用程序包信息jobject pi_obj=NULL; //GET_SIGNATURES 64 pi_obj=env-CallObjectMethod(pm_obj, package_info_id, package_name, 64);**如果未找到package_name,以上代码将返回以下异常I会报告。

捕获异常

释放资源

Native提供了ExceptionOccurred和ExceptionCheck方法来检测是否发生异常。前者返回jthrowable 类型,后者返回jboolean 类型。如果发生异常,则通过ExceptionDescribe方法打印异常信息。请参考LogCat中的相应信息。 Information 和ExceptionClear 方法是不会直接导致应用程序崩溃的重要方法。这类似于Java的catch异常处理。这消除了异常。这样当调用Java时就会出现异常。本机已处理。处理完异常后,不要忘记释放相应的资源。但是,只需删除此异常即可。调用者也必须有一个例外。然后你需要通过native抛出异常来通知Java。打电话的人。

void throwByName(JNIEnv *env, const char *name, const char *msg) { jclass cls=env-FindClass(name); if (cls !=NULL) { env-ThrowNew(cls, msg); } env-DeleteLocalRef( cls);}//调用抛出异常extern 'C'JNIEXPORT void JNICALLJava_com_glumes_cppso_jnioperations_ExceptionOps_nativeThrowException(JNIEnv *env, jobjectinstance) { throwByName(env, 'java/lang/IllegalArgumentException', 'native throwException');}jni错误日志分析ndk崩溃,在/data/tombstones 文件夹中生成格式为tombstone_xx 的逻辑删除文件。 Google 还提供了addr2line/objdump/ndk-stack 工具。典型的逻辑删除文件包含:

*** *** *** *** *** *** *** *** *** *** *** *** *** ***指纹: 'Android-x86/版本android_x86/x86:5.1.1/LMY48W/woshijpf04211939:eng/test-keys'Revision:'0'ABI:'x86'pid: 1019,tid: 1019,name: surfaceflinger /system/bin/surfaceflinger 文件结构

定位工具addr2lineqinqundeMacBook-Pro% ./aarch64-linux-android-addr2line -C -f -e ~/Documents/DProtect2/mylibrary/build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so 0000000000157efcJava_com_dofun_dprotect_lib_LocalWork_start/users/qinqun/Documents/DProtect2/mylibrary/src/main/cpp/native-lib.cpp:147ndk-stack 需要完整代码的同学可以私信发送“底层源码”,免费获取。马苏。您可以获得更多《Android 学**笔记源码解析面试视频》

JNI 特性: 二进制兼容性 实现本地方法库与同一平台上所有Java 虚拟机之间的二进制兼容性,允许开发人员在给定平台上仅使用本地方法库的一个版本,您只需维护. JNI 可以高效地实现实时系统优化为与虚拟机无关,以确保高效运行和强大功能 JNI 允许将本地方法集成到Java 虚拟机内核中通过JNI 函数实现本地代码与Java 虚拟机的互操作。 JNI函数是通过接口指针获得的,本地方法接受JNI接口指针作为参数。当虚拟机调用本地方法时,如果从同一个Java 线程多次调用本地方法,则该本地方法的接口指针是相同的。当从不同的Java 线程调用时,本地方法接受不同的JNI 接口指针。

最后,想要完整代码的同学可以私信发送“底层源码”,免费获取。立即提交即可获得更多:010 - 30000。技术永无止境。您需要了解每一行代码。您提交的内容以及您使用的所有工具。只有承担责任并不断探索底层原理,才能将技术提升到更高的水平。成为一名Android 架构师还有很长的路要走。请让我分享一下。如果您对PS: 有任何疑问,请随时修复。您可以在评论区留下您的建议和想法。欢迎。请点赞和评论。如果您觉得内容不错,可以转发分享。

责任编辑:德勤钢铁网 标签:

热门搜索

相关文章

广告
德勤钢铁网 |市场分析

native和local的区别,nat的作用

chanong

|

什么是JNI? JNI 代表Java 本机接口。使用Java 本机接口编写程序可以更轻松地将代码移植到不同的平台。从Java 1.1 开始,JNI 标准成为Java 平台的一部分。这允许您使用Java 代码之类的东西。本地代码和Java 虚拟机通过JNI 函数与用该语言编写的代码进行交互。 JNI函数是通过接口指针获取的,本地方法以JNI接口指针作为参数。 虚拟机保证从同一个Java 线程上多次调用本地方法时,传递给本地方法的接口指针是相同的JNI 接口指针本地方法被不同的Java 线程调用时使用JNI,您接受各种JNI接口指针并使用JNI与您的算法进行交互,主要是为了提高算法的性能并最大限度地利用您机器的硬件资源。

Android的语言层分为Java层和native层,为什么会有native层呢?这是因为在Java之前,很多功能和系统都是用原生语言编写的,Java出现之后,就不需要重新发明轮子了,你可以直接调用这些方法,并且原生层更接近。转换为汇编语言,从而提高性能。你会在你的代码中看到Java层调用native层的方法,但是这个跨语言的调用过程就是JNI。如果您有无法使用Java 语言处理的任务,您可以使用JNI 来:请完成它。

JNI 的应用场景如下: 需要调用一些Java 语言不支持的函数,依赖于操作系统平台的能力; 需要调用当前UNIX 系统上的某些函数。 Java 不支持,必须使用JNI 如果你的程序对时间敏感或者性能要求特别高,为了提高运行效率,应该使用低级语言 音视频开发相关的音视频编解码器要求更快需要使用JNI 集成Java 语言开发的系统 需要使用以前实现的一些C/C++ 语言开发的功能或系统新版本将这些功能集成到当前系统中JNI 是一个使Java 更加全面,提高Java 封装各个平台差异的能力的重要一步。

JNI异常处理在Android NDK开发过程中,调用Java对象方法可能会抛出异常。如果NDK层不做任何事情,程序会直接崩溃。例如,如果您想对APK 进行签名。 JNI层的代码如下:

**jclassnative_class=env-GetObjectClass(const_cast(contextObject)); jmethodID pm_id=env-GetMethodID(native_class, 'getPackageManager', '()Landroid/content/pm/PackageManager;'); jobject pm_obj=env-CallObjectMethod(const_cast) (contextObject), pm_id); jclass pm_clazz=env-GetObjectClass(pm_obj); jmethodID package_info_id=env-GetMethodID(pm_clazz, 'getPackageInfo','(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;') ; //获取应用程序包信息jobject pi_obj=NULL; //GET_SIGNATURES 64 pi_obj=env-CallObjectMethod(pm_obj, package_info_id, package_name, 64);**如果未找到package_name,以上代码将返回以下异常I会报告。

捕获异常

释放资源

Native提供了ExceptionOccurred和ExceptionCheck方法来检测是否发生异常。前者返回jthrowable 类型,后者返回jboolean 类型。如果发生异常,则通过ExceptionDescribe方法打印异常信息。请参考LogCat中的相应信息。 Information 和ExceptionClear 方法是不会直接导致应用程序崩溃的重要方法。这类似于Java的catch异常处理。这消除了异常。这样当调用Java时就会出现异常。本机已处理。处理完异常后,不要忘记释放相应的资源。但是,只需删除此异常即可。调用者也必须有一个例外。然后你需要通过native抛出异常来通知Java。打电话的人。

void throwByName(JNIEnv *env, const char *name, const char *msg) { jclass cls=env-FindClass(name); if (cls !=NULL) { env-ThrowNew(cls, msg); } env-DeleteLocalRef( cls);}//调用抛出异常extern 'C'JNIEXPORT void JNICALLJava_com_glumes_cppso_jnioperations_ExceptionOps_nativeThrowException(JNIEnv *env, jobjectinstance) { throwByName(env, 'java/lang/IllegalArgumentException', 'native throwException');}jni错误日志分析ndk崩溃,在/data/tombstones 文件夹中生成格式为tombstone_xx 的逻辑删除文件。 Google 还提供了addr2line/objdump/ndk-stack 工具。典型的逻辑删除文件包含:

*** *** *** *** *** *** *** *** *** *** *** *** *** ***指纹: 'Android-x86/版本android_x86/x86:5.1.1/LMY48W/woshijpf04211939:eng/test-keys'Revision:'0'ABI:'x86'pid: 1019,tid: 1019,name: surfaceflinger /system/bin/surfaceflinger 文件结构

定位工具addr2lineqinqundeMacBook-Pro% ./aarch64-linux-android-addr2line -C -f -e ~/Documents/DProtect2/mylibrary/build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so 0000000000157efcJava_com_dofun_dprotect_lib_LocalWork_start/users/qinqun/Documents/DProtect2/mylibrary/src/main/cpp/native-lib.cpp:147ndk-stack 需要完整代码的同学可以私信发送“底层源码”,免费获取。马苏。您可以获得更多《Android 学**笔记源码解析面试视频》

JNI 特性: 二进制兼容性 实现本地方法库与同一平台上所有Java 虚拟机之间的二进制兼容性,允许开发人员在给定平台上仅使用本地方法库的一个版本,您只需维护. JNI 可以高效地实现实时系统优化为与虚拟机无关,以确保高效运行和强大功能 JNI 允许将本地方法集成到Java 虚拟机内核中通过JNI 函数实现本地代码与Java 虚拟机的互操作。 JNI函数是通过接口指针获得的,本地方法接受JNI接口指针作为参数。当虚拟机调用本地方法时,如果从同一个Java 线程多次调用本地方法,则该本地方法的接口指针是相同的。当从不同的Java 线程调用时,本地方法接受不同的JNI 接口指针。

最后,想要完整代码的同学可以私信发送“底层源码”,免费获取。立即提交即可获得更多:010 - 30000。技术永无止境。您需要了解每一行代码。您提交的内容以及您使用的所有工具。只有承担责任并不断探索底层原理,才能将技术提升到更高的水平。成为一名Android 架构师还有很长的路要走。请让我分享一下。如果您对PS: 有任何疑问,请随时修复。您可以在评论区留下您的建议和想法。欢迎。请点赞和评论。如果您觉得内容不错,可以转发分享。


市场分析