代码之家  ›  专栏  ›  技术社区  ›  user1506104

从另一个目录向apk添加.so(预构建)库

  •  3
  • user1506104  · 技术社区  · 6 年前

    我正试图把我的.so库包括在另一个目录中。编译我的项目很好。但当我运行它时

    java.lang.Unsatisfiedlinkerror:dalvik.system.pathclassloader[dexpathlist[[zip file]/data/app/com.company.gimikapp-2/base.apk“],nativelibrarydirectories=[/data/app/com.company.gimikapp-2/lib/arm,/vendor/lib,/system/lib]]]找不到“libtheprefitlib.so”

    常见的解决方案如下:

    sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
    }
    

    尝试二者

    jniLibs.srcDirs = ['C:\\svn\\sys_libs']
    

    jniLibs.srcDirs = ['C:/svn/sys_libs']
    

    如何将它指向android项目之外的另一个目录?

    这是我的cmakelist.txt:

    cmake_minimum_required(VERSION 3.4.1)
    add_library( native-lib
                SHARED
                src/main/cpp/source/native-lib.cpp )
    add_library(theprebuiltlib SHARED IMPORTED)
    set_target_properties(theprebuiltlib PROPERTIES IMPORTED_LOCATION
                C:/svn/sys_libs/libtheprebuiltlib.so)
    target_include_directories(
                native-lib PRIVATE
                src/main/cpp/source/
                C:/svn/sys_includes/)
    find_library( log-lib
                log)
    target_link_libraries( native-lib
                theprebuiltlib
                ${log-lib})
    

    这是我的JNI的毕业设置:

    android {
        ...
        defaultConfig {
            ...
            externalNativeBuild {
                cmake {
                    cppFlags "-frtti -fexceptions"
                }
                ndk {
                    abiFilters 'armeabi'
                }
            }
            ...
        }
        ...
        externalNativeBuild {
            cmake {
                path "CMakeLists.txt"
            }
        }
        sourceSets {
            main {
                jniLibs.srcDirs = ['C:/svn/sys_libs']
            }
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Alex Cohn    6 年前

    显然,你已经安装了ndk r17和android插件v.3.1.0或更高版本(我们在build.gradle的发布片段中没有看到这一点)。

    但你设置 反滤器 armeabi ,它已被丢弃。你应该设置为 armeabi-v7a ,并确保 libtheprebuiltlib.so 也是为这个ABI而建的,或者你可以 download an older version of NDK 和in build.gradle依赖集

    classpath 'com.android.tools.build:gradle:3.0.1'
    

    你可以强制使用最新的插件句柄 阿米巴比 如果显式设置:

    android {
        defaultConfig {
            ndk {
                abiFilters 'armeabi'
            }
        }
    }
    

    (在你的剧本里 android.defaultconfig.externalnativebuild.ndk版本 ,因此没有效果)。

    你的一个错误 平地 ,应该是

    android {
      sourceSets {
         main { 
           jniLibs.srcDir 'C:/svn/sys_libs' 
         }
       }
    }
    

    当你拿到文件的时候 C:\svn\sys_libs\armeabi\libtheprebuiltlib.so . 但这不能解释为什么 克苏 不按预期工作。

        2
  •  1
  •   user1506104    6 年前

    对于ndk r16和gradle插件v3.1.2,这里是逐步解决方案(感谢@alex cohn)。

    1. 集合 android.sourceSets.main.jniLibs.srcDir 指向外部的位置。所以

      android {
          sourceSets {
              main { 
                  jniLibs.srcDir 'C:/svn/sys_libs' 
              }
         }
      }
      
    2. 确保您的External.so位于上述路径(步骤1)中,并附加正确的体系结构。对我来说,是的 armeabi ,所以我的。所以在

      C:/svn/sys_libs/armeabi/libtheprebuiltlib.so
      
    3. 移动 ndk android.defaultConfig.externalNativeBuild.ndk android.defaultConfig.ndk 像这样

      android {
          defaultConfig {
              ndk {
                  abiFilters 'armeabi'
              }
          }
      }
      
    4. 确保cmakelists.txt指向具有正确体系结构的完整路径。

      set_target_properties(theprebuiltlib PROPERTIES IMPORTED_LOCATION
              C:/svn/sys_libs/armeabi/libtheprebuiltlib.so)