原来还有这种操作,libs和jniLibs 还有jni不得不说的关系

时间:2024-05-19 07:16:42

今天遇到一个android studio的.so文件的问题,当运行的时候出现了这样的一个错误java.lang.UnsatisfiedLinkError: com.android.tools.fd.runtime.IncrementalClassLoader$DelegateClassLoader,这个错误就是.so文件不存在或者是文件路径不正确,我可以确定文件是存在的所以一定就是文件路径不对了。也就是说,我的文件路径放的不对,导致没有被放到apk里面,所以运行的时候就会报错,但是我们的so文件为什么没有被打包到我们的apk文件中?


这是因为在eclipse中,我们把so文件放入libs目录里,可以被打包到apk中,但是在android studio中,如果将so文件放在libs目录里,是不会被打包到apk中的,只有jniLibs目录里的so文件会被打包到apk中,当然这个目录指定的文件夹可以更改,但是默认就是\src\main\jniLibs,所以在没有做指定的情况下我们只有把so文件放在这里才能被打包运行。


首先解决这个问题的方式就是:


1,在project选项卡,下面创建如图的jniLibs目录,我们将我们需要的.so

文件复制到这个里面就可以了,这样创建的目录就是android studio默认的so文件路径了。直接创建文件把文件名设置为这个就可以了。


原来还有这种操作,libs和jniLibs 还有jni不得不说的关系


这个时候我们切换选项卡到android,就可以看到我们多了一个jniLibs目录,并且这个目录一看就不是那种自己创建的普通目录,比那些不知道高到哪里去了。可以看到现在他们两个里面的文件内容是对应的。


原来还有这种操作,libs和jniLibs 还有jni不得不说的关系


这就证明创建正确,这个也是在android studio中创建jniLibs目录的方法,当然这个和jni不一样,jni是这样创建的。

原来还有这种操作,libs和jniLibs 还有jni不得不说的关系


2.我们任然把so文件放在libs目录下,但是我们去重新指定jniLibs目录对应的文件夹,指定方法就是在gradle文件里面的android{ ....},添加一个


sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}


这样我们就能把libs目录也作为so文件的目录了,这个其实算是添加,因为你如果继续把so文件放在jniLibs目录下,也仍然可以,而且这里可以在‘libs’后面添加其他的目录。

添加然后同步这个时候我们可以发现,在原来project选项卡下,libs目录里面的内容,会对应到android选项卡下的jniLibs目录。


原来还有这种操作,libs和jniLibs 还有jni不得不说的关系

当我们切换到android选项卡,就可以看到改目录的内容已经改变,因为我们在gradle里面指定jniLibs='libs',这样我们把so文件放在libs,目录下也能过找到了。


原来还有这种操作,libs和jniLibs 还有jni不得不说的关系


当然,以上都是我瞎猜的,你就试试不行再去看看别的,哈哈哈!