首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何修复颤动时从JNI_OnLoad错误返回的错误JNI版本

首先,JNI(Java Native Interface)是Java提供的一种机制,用于在Java代码中调用本地(C/C++)代码。JNI_OnLoad是JNI规范中的一个函数,用于在动态链接库加载时进行初始化操作。

当从JNI_OnLoad错误返回时,可能是由于错误的JNI版本导致的颤动(trembling)。要修复这个问题,可以按照以下步骤进行操作:

  1. 确认JNI版本:首先,需要确认JNI版本是否正确。JNI版本是由Java虚拟机(JVM)决定的,通常与Java Development Kit(JDK)版本相对应。可以通过查看JDK文档或使用命令行工具javac -version来确定当前使用的JNI版本。
  2. 更新JNI代码:如果JNI版本不正确,需要更新JNI代码以适应正确的JNI版本。这可能涉及到修改JNI函数的签名、调用正确的JNI函数等操作。具体的修改方式取决于具体的JNI代码和使用的JNI库。
  3. 重新编译和构建:一旦JNI代码被更新,需要重新编译和构建相关的代码。这可能涉及到使用适当的编译器和构建工具,如GCC、Makefile等。
  4. 测试和调试:完成重新编译和构建后,需要进行测试和调试以确保修复了颤动错误。可以使用各种测试工具和调试器来验证修复的有效性。

需要注意的是,以上步骤是一般性的修复过程,具体的修复方法可能因具体情况而异。此外,为了更好地理解和解决JNI相关问题,建议深入学习JNI的相关知识和调试技巧。

关于腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体品牌商,无法给出具体链接。但腾讯云作为一家知名的云计算服务提供商,提供了丰富的云计算产品和解决方案,可以通过访问腾讯云官方网站获取相关信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

「音视频直播技术」JNI编程常见问题

异常 当异常待处理,不能调用大多数JNI函数。您代码应该会注意到异常(通过函数返回值,ExceptionCheck或ExceptionOccurred)并返回,或者清除异常并处理它。...Direct ByteBuffers:将错误参数传递给NewDirectByteBuffer。 Exceptions:在异常挂起进行JNI调用。...jmethodIDs:在进行调用时,使用错误jmethodID方法做JNI调用:不正确返回类型,静态/非静态不匹配,错误类型为'this'(非静态调用)或错误类(用于静态调用)。...类型安全:本机方法返回不兼容类型(例如:声明返​​回String方法返回StringBuilder)。 UTF-8:将无效修改后UTF-8字节序列传递给JNI调用。...JNI直接构建对它们支持,并且在将来版本中性能会得到改善。 小结 本文首先介绍了JNI加载动态库常用规则,然后讲了使用UTF-8需要注意事项。

1.6K20
  • 【Android FFMPEG 开发】C++ 回调 Java 方法 模板 ( JavaVM *vm | JNIEnv *env | jobject instance | 引用类型 | 模板代码示例 )

    前置知识点 : 参考 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 ) 博客内容 , 了解如何在 C++ 中调用..., 注意子线程 JNI 环境需要获取 , 主线程 JNI 环境可以直接 Native 层实现 Java 方法中获取 ; ② jobject instance : 在 Native 层 Java...JavaVM *vm ---- JavaVM *vm 获取方法 : 在 JNI_OnLoad() 方法中获取 ; //JNI_OnLoad 中获取 Java 虚拟机对象放在这里 JavaVM *javaVM...; int JNI_OnLoad(JavaVM *vm, void *r){ javaVM = vm; return JNI_VERSION_1_6; } JNI_OnLoad 参考...= 0; //JNI_OnLoad 中获取 Java 虚拟机对象放在这里 JavaVM *javaVM; int JNI_OnLoad(JavaVM *vm, void *r){ javaVM

    1K20

    【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives )

    JNI_OnLoad 函数原型 : Java 类中调用 System.loadLibrary(“native-lib”) 代码 , 调用 JNI_OnLoad 方法 ; ① jni.h 中有该函数声明...); ② 参数列表说明 : JavaVM* vm : 表示 Java 虚拟机 ; void* reserved : 一般是 NULL ; ③ 返回值说明 : 返回当前 NDK 使用 JNI 版本 ;...JNI 版本 中可选有四个值 , 但是只能选择返回后三个 JNI_VERSION_1_2 , JNI_VERSION_1_4 , JNI_VERSION_1_6 , 返回上述三个值任意一个没有区别 ;...** env : JNIEnv 二级指针 ; jint version : JNI 版本 , 一般传入 JNI_VERSION_1_6 ; ② 返回值说明 : 返回动态注册结果 ; 动态注册成功 :...返回值说明 : int 类型返回值代表了当前 NDK 使用 JNI 版本 JNI 版本 中可选有四个值 , 但是只能选择返回后三个 JNI_VERSION_1_2

    93920

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

    于此同时,产生一个Load事件,这个事件触发后,程序默认会在载入.so文件函数列表中查找JNI_OnLoad函数并执行,与Load事件相对,在载入.so文件被卸载,Unload事件被触发。...我们可以将JNI_OnLoad函数看做构造函数在初始化时候调用,可以将JNI_OnUnLoad函数看做析构函数在被卸载时候调用; 应用层Java程序需要调用本地方法,虚拟机在加载动态文件中定位并链接该本地方法...for \"%s\"]", pathName); } //调用JNI_OnLoad,并获取返回版本信息 version = (...,这是为什么要返回正确版本原因。...RTLD_WORLD 返回值: 打开错误返回NULL; 成功,返回库引用; dlsym函数 函数原型是void* dlsym(void* handle,const char* symbol), 该函数在

    2.7K40

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

    前面总结了静态实现JNI方法,本文介绍如何动态实现JNIJNI在加载,会调用JNI_OnLoad,而卸载时会调用JNI_UnLoad,所以我们可以通过在JNI_OnLoad里面注册我们native...我们知道,系统初始化JNI在加载,会调用JNI_OnLoad(),而卸载时会调用JNI_UnLoad();所以,我们可以通过重写JNI_OnLoad(),在JNI_OnLoad()中将函数注册到Android...= JNI_OK) { return result; } register_ndk_load(env); // 返回jni版本 return...JNI_OnLoad()会在JNI注册被调用。在JNI_OnLoad()中,调用register_ndk_load()。...当我们在Java中调用HelloLoad(),实际调用是native_hello()。 (03) 在jni目录下新建Android.mk,Android.mk代码如下: ?

    75120

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

    (一)、静态注册native函数 根据函数名找到对应JNI函数;Java层调用某个函数,会对应JNI中寻找该函数,如果没有就会报错,如果存在就会建立一个关联关系,以后再调用时会直接使用这个函数...版本,如果你库里面没有写明JNI_OnLoad()函数,VM会默认该库使用最老JNI 1.1版本。...由于最新版本JNI做了很多扩充,也优化了一些内容,如果需要使用JNI版本功能,就必须在JNI_OnLoad()函数声明JNI版本。...其中JNIEXPORT和JNICALL是两个宏定义,用于指定该函数JNI函数。...上面讲解了如何JNI中调用Java类中方法,其实在jni.h中已经定义了一系列函数来实现这一目的,下面我们就以此举例说明: (一)、获取Class对象 为了能够在C/C++中调用Java中类,jni.h

    2.2K30

    「音视频直播技术」看ijkplayer如何使用JNI

    在哪儿注册最好 上面我们知道了如何注册C/C++方法,那么在什么地方注册好呢?答案是在 JNI_OnLoad 函数中。...在加载动态链接库,JavaVM会主动调用JNI_OnLoad(JavaVM * jvm, void * reserved)(如果你实现在JNI_OnLoad函数),所以在这里注册是最好地方。...当然,有了 JNI_OnLoad 还要有 JNI_OnUnload 函数。它在共享库被卸载时调用,可以在这里释放一些资源。 通过上面的操作我们就可以 Java 调用 C++代码了。...有没有赶快去试试冲动?先别急,现在只介绍了如何 Java 调用 C/C++方法。那么反回来如何 C/C++ 调 Java 代码呢?...方法参数包含在“()”中,返回值在括号外! 方法参数个数较多时会依次以“;”隔开。 当参数或者返回值是基本数据类型,必须用其在JNI描述符表示。

    2.1K10

    JNI操作接口实践(三)

    二、动态注册 1、注册步骤 1)建立java函数和C函数映射数组(签名必须一致) 2)通过RegisterNatives注册映射数组 3)重写JNI_OnLoad方法,动态库加载就会调用JNI_OnLoad...描述返回值和入参);fnPtr-c中实现函数指针;JNI_OnLoad作用是绑定JNINativeMethod和class直接关系并返回JNI版本号。...在执行JNI_OnLoad完成注册后,当java代码中执行Native方法根据调用类可以找对应JNINativeMethod再根据方法名和方法签名可以找到对应C语言函数指针。...registerNatives(env)) { return -1; } //返回jni 版本 return JNI_VERSION_1_6; } 以上就是关于...jni动态方法注册,基本思路:定义方法数组---在jni_load注册方法数组。

    29830

    Android JNI线程操作

    学习一下如何在 Native 代码中使用线程。 Native 中支持线程标准是 POSIX 线程,它定义了一套创建和操作线程 API 。...第三个参数为该线程启动程序函数指针,也就是线程启动要执行那个方法,类似于 Java Runnable 中 run 方法,它函数签名格式如下: void* start_routine(void*...第四个参数为线程启动程序参数,也就是函数参数,如果不需要传递参数,它可以为 NULL 。 pthread_create 函数如果执行成功了则返回 0 ,如果返回其他错误代码。...AttachCurrentThread 方法是由 JavaVM 指针调用,它代表是 Java 虚拟机接口指针,可以在 JNI_OnLoad 加载来获得,通过全局变量保存起来 static JavaVM...*gVm = NULL; JNIEXPORT int JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEnv *env; if

    1.1K20

    Android Linker 与 SO 加壳技术

    SO 层面的保护手段,有两个介入点, 一个是 jni_onload, 另一个就是初始化函数,比如反调试、脱壳等,逆向分析时经常需要动态调试分析这些初始化函数。...SO 初始化函数便可以满足这个要求,同时在 Android 系统下还可以使用 JNI_ONLOAD 函数,因此 loader 执行时机有两个选择: SO init 或 initarray jni_onload...3.2.1 装载 还原后 SO 在内存中,所以装载主要变化就是文件装载到内存装载。 Linker 在装载 PT_LAOD segment,使用 SO 文件描述符 fd: ?...其他步骤基本按照 Linker 实现即可,只需要将一些文件读取修改为内存读取,比如读 elfheader和program header。...3.3 soinfo 修复 SO 加壳最关键技术点在于 soinfo 修复,由于 Linker 加载是 loader,而实际对外使用是被保护 SO,所以 Linker 维护 soinfo 可以说是错误

    3.1K61

    你应该了解JNI知识(三)——注意点

    native层打印logcat日志 native层打印logcat日志,有两种方式: 调用Java层Log.i/v()之类方法,可以参考你应该了解JNI知识(二)——Java与JNI互相调用,里面介绍了如何在...使用liblog.so进行打印,和Log.i/v()底层使用同样原理 这里主要介绍如何使用第二种方法打印日志。...混淆 做Android同学都会遇到混淆问题,而涉及到了JNI、NDK更需要注意混淆问题,这是因为不论是静态注册还是动态注册,都涉及到了包名类名方法名这样关系,而这样关系是绝对,因此是不能进行混淆...全局引用和局部引用 试想一种场景,在JNI_OnLoad中通过FindClass找到某一个类,然后用作静态变量,在以后某个场景使用该静态场景,一些是不是设想很美好,但在JNI环境中是不行。...会阻止GC回收所引用对象,不在本地函数中跨函数使用,不能跨线程使用。函数返回后局部引用所引用对象会被JVM自动释放,或调用DeleteLocalRef释放。

    1.2K70

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

    Java1.1开始,JNI标准成为java平台一部分,它允许Java代码和其他语言写代码进行动态交互,JNI标准保证本地代码能工作在任何Java 虚拟机环境,目前很多热修复开源项目。...2 如何使用 在目前Android开发中,一般情况下有2种方法来使用JNI编程,就是传统需要手动生成h文件和新版CMake,Cmake是利用配置文件来完成一些配置,实际上只是简化了流程,用CMakeLists.txt...这里jint对应Javaint数据类型,该函数返回int表示当前使用JNI版本,其实类似于Android系统API版本一样,不同JNI版本中定义一些不同JNI函数。...JNI版本, 失败返回-1 * 这个方法一般都是固定 */ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved...这个工作在JNI_OnLoad中完成,如下代码: JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv *

    1.3K20
    领券