代码改变世界

UnsatisfiedLinkError: No implementation found for , AndroidStudio使用*.so

2017-07-07 11:11  tlnshuju  阅读(1609)  评论(0编辑  收藏  举报

今天工作的时候。发现了一个jni的问题,java.lang.UnsatisfiedLinkError: No implementation found for......




问题1:后来查了资料后发现。是因为我在java中定义了native方法。可是在jni中没有相应的方法,这种话java就无法链接到本地方法。




原因:

    造成这样的Error的有两种情况:
    (1) 没有在本地方法中的头文件里定义方法;
    (2) 缺少so文件。




解决方式:

    (1)在.h文件里第一方法,并在.c中实现方法。
    (2)引入so文件;




方案实行分析:

    方案1:这个不用多说,定义方法,自己依据自己的需求去实现;


    方案2:
    步骤(这里仅仅解说在Android Studio下的解决方式):

        (1)在  项目名\app\src\main下新建jniLibs目录,并将相应的.so文件放进去{目录结构为:处理器版本号/***.so(如:armeabi/***.so)},

    

           这样Android Studio就能够在编译的时候载入对用的so文件了;
        (2)注意:重点来了,
           在Android Studio下假设你仅仅有部分平台下的.so文件,并且你不在gradle中做不论什么配置的话,

           那么智能的Android Studio就会在编译的时候编译出其它平台下的.so文件(我在Eclipse中測试的时候没有发现这个问题)

           看好了,我如今仅仅在jniLibs中放入了armeabi版本号的*.so文件,可是在apk中却出现了'x86_64','x86','mips64'等多个版本号的*.so文件。

   这样就会造成程序无法执行【如图】

           

          
           解决方式:

           在.gradle指定相应平台的(代码例如以下),这样就能够在编译的时候让studio仅仅生成相应平台的*.so文件【如图】

           

splits {
        abi {
            enable true
            reset()
            include 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' //select ABIs to build APKs for
            universalApk true //generate an additional APK that contains all the ABIs
        }
    }

Android的.so文件教程參考地址:关于Android的.so文件你所须要知道的