Android NDK调用第三方库文件及找不到第三方库解决方案

如何在Android NDK中调用第三方库文件(.so)

1.在project/jni目录下创建prebuilt子目录(目录名可自定义).

2.将第三方.so放到prebuilt中,并创建Android.mk, 内容如下:

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE := xxx

    LOCAL_SRC_FILES := libxxx.so

    include $(PREBUILT_SHARED_LIBRARY)

3.在project/jni/Android.mk中加入

    LOCAL_SHARED_LIBRARIES := xxx

4.在project/jni/android.mk的最后加入

    include $(LOCAL_PATH)/prebuilt/Android.mk

5.运行cygwin, 到project目录下, 运行$NDK/ndk-build

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。。

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

时间: 2024-11-29 17:14:31

Android NDK调用第三方库文件及找不到第三方库解决方案的相关文章

Android中调用系统的文件浏览器及自制简单的文件浏览器_Android

调用系统自带的文件浏览器这很简单: /** 调用文件选择软件来选择文件 **/ private void showFileChooser() { intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("*/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); try { startActivityForResult(Intent.createChooser(inten

最新的demo中EaseUI的库文件怎么找不到?

问题描述 解决方案 哪个sdk?解决方案二:刚检查了一下,都还在

动态库-ndk调用第三方静态链接库

问题描述 ndk调用第三方静态链接库 android ndk调用第三方静态链接库(.a文件)在android里面我要调用客户给的一个.a库(另有一个.h的头文件),我用ndk-build命令把它编译成.so的过程中一直出现问题.cmd提示如下,请问怎么解决,详细一点,各位大神,拜托了! /i_cheng/android-ndk-r7b-windows/android-ndk-r7b/toolchains/arm-linux-androide bi-4.4.3/prebuilt/windows/b

android-用fatjar打包的Android项目(有调用第三方jar包),调用时找不到第三方jar包的方法

问题描述 用fatjar打包的Android项目(有调用第三方jar包),调用时找不到第三方jar包的方法 用fatjar打包的Android项目(有调用第三方jar包),调用里面的方法时找不到第三方jar包的方法,这是什么问题呢?下面是报的错误,在网上找了很多方法也没有解决: 解决方案 Android项目打第三方jar包

Android NDK开发 (进阶一)

前言 本人是c与c++界的菜鸟,在开发android过程中,感觉到ndk开发越来越重要,故而也来ndk界凑个热闹,希望此类博文对android开发者起到一丢丢的作用~ 什么是NDK? NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU.平台.ABI等差异,开发人员只需要简单修

在Ubuntu中用Android NDK编译FFmpeg

原文:http://www.cnblogs.com/scottwong/archive/2010/12/17/1909455.html 最近在做 Android 上的项目,我被恶心的一塌糊涂.本以为 Java 是 Android 上的一等公民,结果深入学习之后才发现,Java 在 Android 上 就是个做 UI 的,除此之外无论想干什都得用 C 语言去实现.Android 一个非常糟糕差劲的操作系统,甚至连 Windows Mobile 都不如.Android 能取得今天的市场占有率只是因为

c-android ndk编译出的文件在真机上运行出现[1] + Stopped (signal)问题

问题描述 android ndk编译出的文件在真机上运行出现[1] + Stopped (signal)问题 求大神指点下,android ndk编译出的可执行文件,adb push在真机上运行出现 [1] + Stopped (signal)问题,不胜感激 我的Android版本是android4.2.2,用的android-ndk-rb8编译的纯C程序 解决方案 1.确认已添加执行权限(另外有的机型不允许在sdcard上运行,放到/data或者/system分区) 2.确认程序和手机CPU兼

编程语言-库文件是用机器码组成的文件吗?

问题描述 库文件是用机器码组成的文件吗? RT.库文件是用机器码组成的文件吗?凑够30个字,到了吗?到了吗?到了吗?到了吗?到了吗?到了吗? 解决方案 一个库文件的大部分是的,因为库中也有导出符号,资源什么的,这些不是机器码.说白了就是和可执行文件一样,,

gcc-GCC编译时 链接阶段未指定正确的库文件 请大神帮忙看下

问题描述 GCC编译时 链接阶段未指定正确的库文件 请大神帮忙看下 解决方案 头文件有正确包含么?函数名拼写正确么?没找到这个函数. 解决方案二: 你的函数库文件没有link,你需要编译的时候通过-L来指定对应的lib 解决方案三: 我在做linphone 然后就出现问题了