基于PlatinumKit库的DLNA服务端开发
首先,需要特别感谢蓝斯老师的资料,我这里有很大一部分是参考蓝斯老师的,附上传送门:http://blog.csdn.net/lancees/article/details/9178385

图1
PltMediaRendererDelegate *mediaRenderDelegate;
PLT_MediaRenderer *mediaRenderer;
PLT_DeviceHostReference device;
PLT_UPnP upnp;
JNIEXPORT jint JNICALL Java_com_pngcui_skyworth_dlna_jni_PlatinumJniProxy_startDlnaMediaRender
(JNIEnv *env, jclass, jbyteArray name, jbyteArray uuid)
{
;
jbyte *bytes;
char *c_name = ConvertJByteaArrayToChars(env, name, bytes);
jbyte *bytes2;
char *c_uuid = ConvertJByteaArrayToChars(env, uuid, bytes2);
LOGI("name = %s,uuid = %s",c_name,c_uuid);
if(mediaRenderDelegate == NULL)
mediaRenderDelegate = new PltMediaRendererDelegate();
mediaRenderer= new PLT_MediaRenderer(c_name,false,c_uuid);
mediaRenderer->SetDelegate(mediaRenderDelegate);
PLT_DeviceHostReference device1(mediaRenderer);
device = device1;
upnp.AddDevice(device);
ret = upnp.Start();
env->ReleaseByteArrayElements(name, bytes, JNI_ABORT);
env->ReleaseByteArrayElements(uuid, bytes2, JNI_ABORT);
delete c_name;
delete c_uuid;
return ret;
}
NPT_Result
PLT_MediaRenderer::OnAction(PLT_ActionReference& action,
const PLT_HttpRequestContext& context)
{
NPT_COMPILER_UNUSED(context);
/* parse the action name */
NPT_String name = action->GetActionDesc().GetName();
LOGI("OnAction -> %s",name.GetChars());
...
) {
return OnPlay(action);
}
...
return NPT_FAILURE;
}
NPT_Result
PLT_MediaRenderer::OnPlay(PLT_ActionReference& action)
{
if (m_Delegate) {
return m_Delegate->OnPlay(action);
}
return NPT_ERROR_NOT_IMPLEMENTED;
}
NPT_Result
PltMediaRendererDelegate::OnPlay(PLT_ActionReference& action)
{
LOGI("OnPlay");
NPT_String curURI;
action->GetArgumentValue("CurrentURI", curURI);
NPT_String metaData ;
action->GetArgumentValue("CurrentURIMetaData", metaData);
ActionInflect(MEDIA_RENDER_CTL_MSG_PLAY, curURI.GetChars(),metaData.GetChars());
return NPT_SUCCESS;
}
void PltMediaRendererDelegate::ActionInflect(int cmd, const char* value, const char* data)
{
int status;
JNIEnv *env = NULL;
bool isAttach = false;
if(g_vm == NULL)
LOGI("g_vm == NULL");
status = g_vm->GetEnv((void **) &env, JNI_VERSION_1_4);
)
{
status = g_vm->AttachCurrentThread(&env, NULL);
LOGI("status = %d",status);
) {
LOGI("callback_handler: failed to attach , current thread, status = %d", status);
return;
}
isAttach = true;
}
jstring valueString = NULL;
jstring dataString = NULL;
jclass inflectClass = g_inflectClass;
if (inflectClass == NULL)
{
LOGI("inflectClass == NULL return");
}
jmethodID inflectMethod = g_methodID;
if (inflectMethod == NULL)
{
LOGI("inflectMethod == NULL return");
}
if (inflectClass == NULL || inflectMethod == NULL)
{
LOGI("goto end");
goto end;
}
LOGI("CMD = %d VALUE = %s DATA = %s",cmd, value, data);
valueString = env->NewStringUTF(value);
dataString = env->NewStringUTF(data);
env->CallStaticVoidMethod(inflectClass, inflectMethod, cmd, valueString, dataString);
env->DeleteLocalRef(valueString);
env->DeleteLocalRef(dataString);
end:
if (env->ExceptionOccurred())
{
LOGI("clear...");
env->ExceptionDescribe();
env->ExceptionClear();
}
if (isAttach)
{
g_vm->DetachCurrentThread();
}
}
注:Android6.0以上版本无法使用 env->CallStaticVoidMethod进行反射,因为google官方对jvm进行了一些列的优化
void InitInflectClass(JavaVM* vm)
{
g_vm = vm;
JNIEnv *env = NULL;
int status = g_vm->GetEnv((void **) &env, JNI_VERSION_1_4);
)
{
return ;
}
jclass inflectClass = env->FindClass("com/pngcui/skyworth/dlna/jni/PlatinumReflection");
if (inflectClass == NULL)
{
LOGI("inflectClass == NULL return");
return ;
}
g_inflectClass = (jclass)env->NewGlobalRef(inflectClass);
jmethodID methodID = env->GetStaticMethodID(inflectClass, "onActionReflection", "(ILjava/lang/String;Ljava/lang/String;)V");
if (methodID == NULL)
{
LOGI("methodID == NULL return");
return ;
}
g_methodID = methodID;
return ;
}
/*
* Class: com_pngcui_skyworth_dlna_jni_PlatinumJniProxy
* Method: responseGenaEvent
* Signature: (J)I
*/
JNIEXPORT jboolean JNICALL Java_com_pngcui_skyworth_dlna_jni_PlatinumJniProxy_responseGenaEvent
(JNIEnv *env, jclass, jint cmd, jbyteArray value, jbyteArray data)
{
// NPT_LOG_INFO("response");
jbyte *bytes;
char *c_value = ConvertJByteaArrayToChars(env, value, bytes);
jbyte *bytes2;
char *c_data = ConvertJByteaArrayToChars(env, data, bytes2);
LOGI("ResponseGenaEvent value = %s data = %s",c_value,c_data);
mediaRenderer->UpdateServices(c_value,c_data);
env->ReleaseByteArrayElements(value, bytes, JNI_ABORT);
env->ReleaseByteArrayElements(data, bytes2, JNI_ABORT);
delete c_value;
delete c_data;
return true;
}
NPT_Result
PLT_MediaRenderer::UpdateServices(const char* value,const char* data)
{
PLT_Service* serviceUpdate;
if(FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", serviceUpdate) == NPT_ERROR_NO_SUCH_ITEM){
LOGI("cant find PLT_Service.....");
return NPT_FAILURE;
}
) == ) == ':')
{
) == 'd')
{
serviceUpdate->SetStateVariable("CurrentTrackDuration", value);
serviceUpdate->SetStateVariable("CurrentMediaDuration", value);
}
else
{
serviceUpdate->SetStateVariable("RelativeTimePosition", value);
serviceUpdate->SetStateVariable("AbsoluteTimePosition", value);
}
}
else
{
serviceUpdate->SetStateVariable("TransportState", value);
}
return NPT_SUCCESS;
}
NPT_Result
PLT_MediaRenderer::OnAction(PLT_ActionReference& action,
const PLT_HttpRequestContext& context)
{
...
// other actions rely on state variables
NPT_CHECK_LABEL_WARNING(action->SetArgumentsOutFromStateVariable(), failure);
return NPT_SUCCESS;
failure:
action->SetError(,"No Such Action.");
return NPT_FAILURE;
}
接下来就是APP播放的实现了,可参考蓝斯老师的博客:http://blog.csdn.net/lancees/article/details/8951679
基于PlatinumKit库的DLNA服务端开发的更多相关文章
- 基于JAX-WS的Web Service服务端/客户端 ;JAX-WS + Spring 开发webservice
一.基于JAX-WS的Web Service服务端/客户端 下面描述的是在main函数中使用JAX-WS的Web Service的方法,不是在web工程里访问,在web工程里访问,参加第二节. JAX ...
- Day01_搭建环境&CMS服务端开发
学成在线 第1天 讲义-项目概述 CMS接口开发 1 项目的功能构架 1.1 项目背景 受互联网+概念的催化,当今中国在线教育市场的发展可谓是百花齐放.如火如荼. 按照市场领域细分为:学前教育.K12 ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- Swift3.0服务端开发(三) Mustache页面模板与日志记录
本篇博客主要介绍如果在Perfect工程中引入和使用Mustache页面模板与日志记录系统.Mustache页面模板类似于PHP中的smarty模板引擎或者Java中的JSTL标签.当然Mustach ...
- Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)
前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架.本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在<Swift3.0服务端开发(一)>这篇 ...
- WCF服务端开发和客户端引用小结
1.服务端开发 1.1 WCF服务创建方式 创建一个WCF服务,总是会创建一个服务接口和一个服务接口实现.通常根据服务宿主的不同,有两种创建方式. (1)创建WCF应用程序 通过创建WCF服务应用程序 ...
- 从架构师视角看是否该用Kotlin做服务端开发?
前言 自从Oracle收购Sun之后,对Java收费或加强控制的尝试从未间断,谷歌与Oracle围绕Java API的官司也跌宕起伏.虽然Oracle只是针对Oracle JDK8的升级收费,并释放了 ...
- 微服务项目开发学成在线_day01_CMS服务端开发
05-CMS需求分析-什么是CMS 什么是CMS?CMS (Content Management System)即内容管理系统,不同的项目对CMS的定位不同.CMS有哪些类型? 每个公司对每个项目的C ...
- 俯瞰 Java 服务端开发
原文首发于 github ,欢迎 star . Java 服务端开发是一个非常宽广的领域,要概括其全貌,即使是几本书也讲不完,该文将会提到许多的技术及工具,但不会深入去讲解,旨在以一个俯瞰的视角去探寻 ...
随机推荐
- Linux_破解密码-营救模式
实验用机:CentOS 5.7 破解密码 设置开机启动界面 系统运行级别 营救模式 一.破解密码 root用户可以更改任何用户的密码,普通用户只能修改自己的密码. 步骤: 1.重新启动系统 2.开机倒 ...
- TCP/UDP客户端
Python 网络编程----模块socekt 在渗透测试的过程中,经常会遇到需要创建一个TCP客户端来连接服务器.发送垃圾数据.进行模糊测试活进行其他任务的情况. 简单的TCP客户端代码: #!/u ...
- Submin1安装记录(CentOS5)
安装SVN和Apache wget http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco -O /tmp/RPM-GPG-KEY-WANdisco & ...
- spark 2.1.0 集群安装
jdk安装 http://www.cnblogs.com/xiaojf/p/6568426.html scala2.11 安装 http://www.cnblogs.com/xiaojf/p/6568 ...
- IPad分屏,当电脑第二显示屏
最在在网上看到使用IPad可以做为电脑的第二个显示屏,对于我这样一个程序猿来说,这真是我的福音呀!因此在网上搜了许多关于Ipad投屏的信息,下面简单说明一下,包括怎么使用! 1.根据在网上搜索的结果, ...
- FTP服务器搭建及操作(一)
FTP服务器搭建及操作(一) FTP搭建 PHP FTP操作 搭建方法参照(windows):http://www.cnblogs.com/lidan/archive/2012/06/04/25351 ...
- JavaSE教程-01初识Java-思维导图
图片看不清楚时: 1)可以将图片另存为图片,保存在本地来查看 2)右击在新标签中打开放大查看. 分解: 1.计算机基本概念的普及 硬件 cpu.内存.硬盘等 软件 系统级软件 Windows.Linu ...
- 提升单元测试体验的利器--Mockito使用总结
为神马要使用Mockito? 在编写单元测试的时候,为了尽可能的保证隔离性,我们时常需要对某些不容易构造或者不容易获取或者对外部环境有依赖的对象,用一个虚拟的对象来创建以便于测试.假设你正在开发的的代 ...
- SSO框架介绍前篇
SSO全程是single sign on,即单点登录,是一种统一认证和授权机制. 单点登录,指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其 ...
- Win7安装Docker
系统环境 1. windows 7 旗舰版64位 i5-2450M CPU 8G内存 2.支持“ Hardware Virtualization Technology”,并且,“virtualiza ...