NDK下 将Platinum SDK 编译成so库 (android - upnp)
Platinum UPnP SDK 是一个跨平台的C++库,利用该库,可以很容易就构建出DLNA/UPnP控制点(DLNA/UPnP Control Point)和DLNA/UPnP设备(DLNA/UPnP Device),其中包括有UPnP AV Media Server, Media Render & Control Point的例子。它可以在Windows, Mac OSX, Linux, iPhone, Android, Symbian等多种C语言开发平台上编译通过且运行
官方网址:http://www.plutinosoft.com/platinum
SDK下载地址:http://sourceforge.net/projects/platinum/
下载后得到一个PlatinumKit-1-0-4-2_99100e_aab601.zip
版本信息为
Platinum Kit Version 1-0-4-2
-----------------------------
Neptune: aab601
Platinum: 99100e
解压开来先熟悉下该包的内容
查看Platinum目录下的ReadMe.txt
该包包含了这两个主要的库
进入Platinum\Build\Targets\x86-microsoft-win32-vs2008目录
打开PlatinumManaged.sln解决方案可以看到工程的关联
Neptune和Platinum都是静态链接库,后续编译so库会用到
Platinum.Managed是动态链接库,暂时不用管
看看给android调用的so库如何编译
首先要下载ndk组件包
网址:http://developer.android.com/tools/sdk/ndk/index.html#Installing
这里我以ubuntun 64位环境为例,下载android-ndk-r8e-linux-x86_64.tar.bz2
在ubuntun下解压后配置ANDROID_NDK_ROOT环境变量
<1>使用命令vi ~/.bashrc 打开环境变量设置,并在文件末尾添加:
ANDROID_NDK_ROOT=你的ndk根目录绝对路径
export ANDROID_NDK_ROOT
<2>使用命令source ~/.bashrc使环境变量设置生效。
<3>使用命令echo $ANDROID_NDK_ROOT查看是否生效,如果输出完整路径正确,说明环境变量设置ok.
<4>此步可选,使用cd命令进入到androidNDK/samples/hello-jni进入例子目录,然后使用命令:sudo $ANDROID_NDK_ROOT/ndk-build如果编译成功,则会生成so库,表示NDK能够正常Work了
Ndk环境搭好后就可以编译Platinum lib了
<1>在androidNDK目录下面生成out/config.mk文件,里面输入内容如下:
HOST_TAG:=linux-x86
然后保存退出;
<2>进入Platinum目录
打命令scons target=arm-android-linux build_config=Release
(请确保scons工具已安装)
正常的话最后会输出:scons: done building targets.表示编译完成了。
在Platinum\Build\Targets\arm-android-linux\Release目录下生成相关*.a库
不带后缀的是c可执行文件
<3>进入到/PlatinumKit/Platinum/Source/Platform/Android/module/platinum/jni目录下面,
注意:这里需要先修改该jni目录下的Android.mk文件,将LOCAL_LDLIBS += -laxTls改为LOCAL_LDLIBS += -laxTLS,主要是前面生成库的名字是-laxTLS而不是-laxTls
使用命令:$ANDROID_NDK_ROOT/ndk-build NDK_DEBUG=0
编译之后会输出如下信息,表示生成SO库成功。
SharedLibrary : libplatinum-jni.so
Install : libplatinum-jni.so => libs/armeabi/libplatinum-jni.so
进入到目录PlatinumKit/Platinum/Source/Platform/Android/module/platinum/lib目录下面可以看到生成so库.
最后是测试该so库
将Platinum\Source\Platform\Android下的两个工厂导入eclipse
一个是lib工程,一个是apk工程,建立引用关系,然后在platinum工程下建立libs/armeabi目录并将前面编好的so库放进去
运行sample-upnp
示例比较粗糙,start后设备并不能被外界发现,需要自己重新封装,具体用法可参照
Platinum\Source\Tests\MediaRenderer下的MediaRendererTest.cpp文件
可在PlatinumManaged.sln解决方案下将MediaRendererTest工程导入,然后配置项目依赖项把那两个静态库添进来,在window下将MediaRendererTest跑起来可被外界发现
至此一个简单的platinum的so库封装和调用就实现了
至于DMR,DMS以及DMC等实现就需要自己先摸透该框架的使用方法
主要涉及到这三个类
PLT_FileMediaServer:封装实现了DMS
PLT_MicroMediaController:不是库里的类,是其一个例子的类,继承了PLT_SyncMediaBrowser和PLT_MediaController,即实现了DMC
PLT_MediaRenderer:实现了DMR
另外里面许多示例程序包括Platinum.Managed都是值得参考借鉴的
好了Platinum UPnP SDK的初级使用教程到此结束
关于DMR和DMS的实现请参考这两篇博文:
NDK下 将Platinum SDK 编译成so库 (android - upnp)的更多相关文章
- dlib编译成静态库及被其它程序调用
一.git下载:https://github.com/davisking/dlib 官网:http://dlib.net/ 二.vs中编译成静态库 1.在vs2015中创建静态库工程(vs2015以上 ...
- Android导入第三方静态库.a编译成动态库.so
http://ikinglai.blog.51cto.com/6220785/1324985 在Android开发的时候,经常会使用到用c或c++编写的第三方的静态库.如果有源码的话,可以直接跟你自己 ...
- 表格树控件QtTreePropertyBrowser编译成动态库(设计师插件)
目录 一.回顾 二.动态库编译 1.命令行编译动态库和测试程序 2.vs工具编译动态库和测试程序 3.安装文档 4.测试文档 三.设计师插件编译 1.重写QDesignerCustomWidgetIn ...
- 将pugixml库编译成动态库的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 pugixml库默认是编译成静态库的.要把pugixml库编译成一个动态库,需要对代码做一些修改,具体是将 // If ...
- (原)linux下利用cmake来编译jthread开源库
其实上次在用hisi3531平台的时候,就已经编译过一次这个库了,这次换了平台环境,交叉编译器变成了arm-hisiv100-linux-工具链,所以,没办法只能重新来过. 因为之前编译过,所以这次还 ...
- cocos2d-x 3.0 引用第三方库 及编译成apk时android mk文件写法
cocos2d-x 3.0 中.假设你须要使用CocosStudio.Extensions扩展库 等等.都须要自己手动加入. 加入过程例如以下:(比方说如今我要加入libExtensions,libC ...
- Linux下用Intel编译器编译安装NetCDF-Fortan库(4.2以后版本)
本来这个问题真的没必要写的,可是真的困扰我太久%>_<%,决定还是记录一下. 首先,最权威清晰的安装文档还是官方的: Building the NetCDF-4.2 and later F ...
- Couldn't load libPassword from loader:NDK开发中C文件编译成cpu对应的so类库时,找不到类库报错的原因之一
LogCat输出: 03-03 12:42:32.665: E/AndroidRuntime(32432): FATAL EXCEPTION: main03-03 12:42:32.665: E/An ...
- [dpdk] dpdk编译成动态库使用 -- PCI port自动发现与pmd动态加载
1. 修改配置文件 .conf, 设置如下变量的值. [root@D129 x86_64-native-linuxapp-gcc]# cat dpdk/x86_64-native-linuxapp- ...
随机推荐
- UDK——入门开发流程
1.入门级參考UnrealScript代码 UnrealScript模仿JAVA,可是又有巨大的不同,主要是它本身具有完好的结构,貌似UDK把一切都安排好了,就像在盖楼一样.面对一幢已经完工的设计静止 ...
- 传输中文乱码js解决方法
encodeURI要编码两次 var a="我的"; //编译两次 //window.location.href = "http://127.0.0.1:8080/kab ...
- 大到可以小说的Y组合子(零)
问:啊!我想要一个匿名的递归… 答:Y(音同Why)… … … 问:作为一位命令式语言的使用者,为什么会突然折腾起Y组合子呢? 答:的确,这事儿要从很久以前的几次搁浅开始说起…上学的时候,从来没有接触 ...
- c#中的表达式
// 把变量和字面值(在使用运算符时,将它们统称为操作数)与运算符组合起来 // 就可以创建表达式,表达式是计算的基本构件 // 操作数可以是数值也可以是变量 + ; ; int num3 = num ...
- 为什么报错说req未定义,createServer只接受匿名函数吗?
var http = require('http');var server = new http.createServer(handlerRequest(req,res));server.listen ...
- magic Ajax使用以及注意事项
以下是引用片段:一.概述 现在Ajax技术正如火如荼的在Internet上发展着.而面对我们之前开发的ASP.NET1.1的Web项目,类似于下拉框等联动也需要啪啪啪的不断刷新,的确影响到了用户 ...
- cookie丢失、登陆自动退出问题解决
cookie保存在客户端或者内存中,不易丢失.但是在某些情况下会被忽略.在项目过程中遇到过跨域丢失的情况.在VS里面运行的程序,产生的cookie默认是没有domain值的,但是给它设定domain值 ...
- gcc 编译的4个过程简单识记
直入正题,测试编译代码如下: lude <stdio.h> int main() { ,y,z; x*=(y=z=); printf("%d\n",x); z=; x= ...
- HTML5简单入门系列(五)
前言 本篇将讲述HTML5的服务器发送事件(server-sent event) Server-Sent 事件 Server-Sent 事件是单向消息传递,指的是网页自动获取来自服务器的更新. 以前的 ...
- CI(CodeIgniter)学习第二讲
一.CI的文件结构: 了解CI的文件结构可以帮助我们快速的对CI框架有一个整体的认识,就好像我们去了一个陌生的城市一样,对你来讲周围的一切都是陌生和未知的,要想快速的了解这座城市,你可以买一张这座城市 ...