基于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 服务端开发是一个非常宽广的领域,要概括其全貌,即使是几本书也讲不完,该文将会提到许多的技术及工具,但不会深入去讲解,旨在以一个俯瞰的视角去探寻 ...
随机推荐
- C# 特性参数(注解属性加在参数前面)
特性参数 webapi 框架里有很多特性参数,为了解除一些新人的疑惑,写个小例子分享下. class Program { static void Main(string[] args) { var m ...
- awk之随机函数rand()和srand() (转)
转自:http://blog.chinaunix.net/uid-10540984-id-2942041.html 文件: 1234567 abcdefg ...... 现在想要随机抽取5列组成下 ...
- 几个页面loading样式
随手练习了几个loading样式,以后看到有意思的loading样式也会补充上.样式的兼容性建议还是去w3c上看下属性的兼容性,至少我习惯这么多,当然,w3c中文网貌似很久很久没更新过了,可能更好的还 ...
- iOS 手势
一.看这里 二.抽象类 UIGestureRecognizer 继承于该类的有7类:轻点,捏合,拖拽,滑动,长按,旋转,边缘滑动; 一个手势可以绑定多个事件 - (void)addTarget:( ...
- c++ 库函数返回的字符串指针是否需要手动释放
#include <stdio.h> char * tmpnam(char *s); tmpnam函数返回一个不与任何已存在文件同名的有效文件名,如果字符串s不为空,文件名也会写入它.对t ...
- JavaBean自动生成get和set方法
用Myeclipse开发java web程序,写javabean的时候,如果字段很多的话,写get和set方法是一件很无语和浪费时间的事情,所以Myeclipse提供了一个自动生成这些方法的功能. ...
- Perl正则表达式例子
Perl正则表达式 一.介绍 正则表达式各语言都有自己的规范,但是基本都差不多,都是由元字符的组合来进行匹配:由于Nmap内嵌的服务与版本探测是使用的Perl正则规范,因此此篇博客记录一下Perl正则 ...
- java中计算两个时间差
java计算时间差及比较时间大小 比如:现在是2004-03-26 13:31:40 过去是:2004-01-02 11:30:24 我现在要获得两个日期差,差的形式为:XX天XX小时XX分XX秒 方 ...
- SSH连接不上CentOS 主机配置文件导致的原因的解决方法
一.CentOS之SSH的安装与配置 SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定SSH 为建立在应用层和传输层基础上 ...
- 初学MySQL
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品. Mysql默认端口号: 3306 超级用户:root prompt 修改提示符. ( ...