关于Android NDK中调用第三方的动态库

在整合Android RTSP播放器时遇到调用自编译网络库的问题,通过在Android.mk中添加LOCAL_SHARED_LIBRARIES未能成功。经过研究,发现网上教程存在误导,于是自行编写测试程序并在Ubuntu下验证。最终,在Eclipse中创建测试工程,成功调用了包含外部动态库的动态库。推荐一篇关于Android.mk的简介文章以供学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为最近在整合Android 上RTSP播放器的网络库,因需要调用自己编译的网络库,调用一直出现问题,开始时是直接在Android.mk 中加入LOCAL_SHARED_LIBRARIES := libxxx,以为是直接调用成功了,结果后面的各种测试,结果悲剧了,查出是调用网络库的问题,

后面再网上找Android NDK调用第三方动态库的方法,结果是网上的方法各异,有的还不能实现,怀疑是C2C(Copy to Copy)的结果,严重鄙视一下!

便自己在ubuntu下写了一个简单的测试程序,外部调用自己生成的测试库,

以下是Android.mk的代码:

# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)

$(warning  ****LOCAL_PATH**** )
$(warning  $(LOCAL_PATH))

include $(CLEAR_VARS)
LOCAL_MODULE := ShitAdd    
LOCAL_SRC_FILES := NetSdklib/libShitAdd.so		
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/NetSdk/include
include $(PREBUILT_SHARED_LIBRARY)    

include $(CLEAR_VARS)


LOCAL_MODULE    := ShitAdd-test
LOCAL_SRC_FILES := WMNetSdkTest.cpp

LOCAL_SHARED_LIBRARIES  := libShitAdd 
LOCAL_LDLIBS    := -llog -lz -lm 
include $(BUILD_SHARED_LIBRARY)

然后在eclipse上新建一个测试工程,调用刚才那个生成的动态库(注:这个库调用了我生成的一个外部动态库),测试成功!!!

下面转载一篇hudashi网友的关于Android.mk简介的文章,供网友们参考学习:

文章参照http://blog.sina.com.cn/s/blog_67d8d7060100q8un.html 

Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译。
因为所有的编译文件都在同一个 GNU MAKE 执行环境中进行执行,而Android.mk中所有的变量都是全局的。因此,您应尽量少声明变量,不要认为某些变量在解析过程中不会被定义。
一个Android.mk文件可以编译多个模块, 每个模块属下列类型之一
  1)APK程序
  一般的Android程序,编译打包生成apk文件
2)JAVA库
  java类库,编译打包生成jar文件
  3)C\C++应用程序
可执行的C\C++应用程序
  4)C\C++静态库
编译生成C\C++静态库,并打包成.a文件
  5)C\C++共享库
编译生成共享库(动态链接库),并打包成.so文, 有且只有共享库才能被安装/复制到您的应用软件(APK)包中。
  可以在每一个Android.mk file 中定义一个或多个模块,你也可以在几个模块中使用同一个
源代码文件。  编译系统为你处理许多细节问题。例如,你不需要在你的 Android.mk 中列出头文件和依
赖文件。编译系统将会为你自动处理这些问题。这也意味着,在升级 NDK 后,你应该
得到新的toolchain/platform支持,而且不需要改变你的 Android.mk 文件。
注意,NDK的Anroid.mk语法同公开发布的Android平台开源代码的Anroid.mk语法很接近,然而编译系统实现他们的
方式却是不同的,这是故意这样设计的,可以让程序开发人员重用外部库的源代码更容易。
在描述语法细节之前,咱们来看一个简单的"hello world"的例子,比如,下面的文件:
sources/helloworld/helloworld.c
sources/helloworld/Android.mk
'helloworld.c'是一个 JNI 共享库 ,实现返回"hello world"字符串的原生方法。相应的
Android.mk 文件会象下面这样:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= helloworld
LOCAL_SRC_FILES := helloworld.c
include $(BUILD_SHARED_LIBRARY)
  解释一下几行代码:
  LOCAL_PATH := $(call my-dir)
  一个Android.mk file首先必须定义好LOCAL_PATH变量。它表示是当前文件的路径。
在这个例子中, 宏函数‘my-dir’,  由编译系统提供, 用于返回当前路径(即包含Android.mk file
文件的目录)
  include $(CLEAR_VARS)
CLEAR_VARS 由编译系统提供(可以在 android 安装目录下的 /build/core/config.mk 文件看 到其定义,为 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk ),指定让 GNU MAKEFILE 该脚本为你
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值