• Android JNI如何调用第三方库


    http://www.2cto.com/kf/201504/388764.html
    Android JNI找不到第三方库的解决方案 cannot load library

    最近做一个jni项目,拿到的so库需要用jni封装一层,等于是在jni的C++代码里调用第三方库的方法,然后整个项目在Android上运行出结果。

    自己用jni生成的so是libaa.so 使用的第三方库是libbb.so。

    到目前为止,遇到的问题是libbb各种找不到。libbb库去哪儿了?

    E/AndroidRuntime(11626): Caused by: java.lang.UnsatisfiedLinkError:

    Cannot load library: soinfo_link_image(linker.cpp:1640):
    could not load library libbb.so needed by libaa.so;

    caused by load_library(linker.cpp:750): library libbb.so not found

    以上错误是在运行阶段发生的,事实上编译阶段也发生过找不到第三方的问题,表现就是库里实现的方法undefined。

    分两方面解决

    1,编译阶段找不到库,需要修改MK文件。

    1.libbb.so放在jni/prebuilt文件夹(自己新建),同时把Android.mk复制一份到prebuilt下。

    2.libbb.so的mk如下:

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := bb
    LOCAL_SRC_FILES := libbb.so
    include $(PREBUILT_SHARED_LIBRARY)
    (<Dream>如果第三方提供的是.so文件则无须前面两个步骤) 

    3.libaa.so的mk文件需要引入上面的mk。

    LOCAL_PATH := $(call my-dir)
     include $(CLEAR_VARS)
     LOCAL_MODULE    := aa
    LOCAL_SRC_FILES := aa.cpp
    LOCAL_LDLIBS := -llog
     LOCAL_SHARED_LIBRARIES := bb
    include $(BUILD_SHARED_LIBRARY)
    include $(LOCAL_PATH)/prebuilt/Android.mk
    (<Dream>可以静态链接,这样只产生一个.so,做法如下)
    Android.mak
    include $(BUILD_STATIC_LIBRARY)
    Application.mak
    APP_MODULES:=aa

    这样在编译阶段就可以连接到第三方库咯。

    2.运行阶段找不到库

    在运行阶段找不到库就是Android的事情了。后来发现是load库的顺序(默哀一个,破顺序。。)。

    static
        {
            System.loadLibrary(bb);
            System.loadLibrary(aa);
        }
    (<Dream>静态链接,这样就不需要load两个了库)
    先load第三方库,再load自己的库,因为aa库要用bb库里的方法,是依赖于bb库的,所以要先load。。

    这样在运行阶段也可以找到库咯。

     (<Dream>静态链接,请参考这篇文章)

    http://www.rosoo.net/a/201302/16514.html

  • 相关阅读:
    php 数组
    条件语句if else ,switch ,while ,do.while
    if..else 判断中的 Boolean()转换
    wampserver 集成环境
    sublime text 安装及使用
    vue tab切换
    SVG 基础
    gitosis管理员的密钥丢失解决办法
    源码安装MySQL
    Xshell远程登录
  • 原文地址:https://www.cnblogs.com/shinedream/p/4451388.html
Copyright © 2020-2023  润新知