java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad错误的解决

java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad错误的解决_第1张图片

困扰了我一天的一个问题,显示一个so文件报找不到,后来是图上的错误。让我误以为第一个so文件是读到了的。

先简单讲下个人对android项目引入so文件的原理性的理解,知道了这个原理其实就不难查出问题。

1.首先so文件是一个native方法的实现。我们都知道Android的架构,我们编写的应用程序都是在应用层展示的,那么怎么调用更底层的东西呢,比如说应用框架层。那就要依靠native方法去实现了。

2.编写so文件的步骤,首先我们先要定义一个native方法,如下图所示:

java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad错误的解决_第2张图片

然后我们就要实现它,才可以去使用C或者C++去实现它。实现完成之后,打包编译成so文件,那么我们在应用层就可以调用这个native方法,完事,native方法就自动的去找so文件中的方法,有没有实现,找到后去执行它。所以我们定义的native方法就要和引入的so文件在同一个包名下,不然两者是分立的。

引入注意点:

1、引入的so文件前,最好知道Android系统的硬件构造。因为加载so文件是根据你的硬件厂商来的,如下图:

2.所以在不知道硬件构造的情况下,最好是生成多种内核的so,以便适配不同内核的硬件。

3.引入后,需要在代码中控制加载,格式要注意。如图:(至于为什么这样写,那你要问google的开发人员了)

java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad错误的解决_第3张图片

4.使用Android studio的老铁们注意了,加载这玩意需要在app下的build.gradle下写这么一段:

java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad错误的解决_第4张图片

5.最重要的一点,也是我没注意的。相信很多人会忽略。就是加载so文件的代码所在的类,需要和so文件实现所在的类是同一个包名,不然它找不到so文件中native方法的实现。就会出现我一开始说的那个错误。

你可能感兴趣的:(android技术文档,android,studio)