关于Platinum库的MediaRender具体C++代码实现探讨

接上篇博文NDK下 将Platinum SDK 编译成so库 (android – upnp)

sample-upnp工程来测试生成的so库是无效的

大家比对一下Platinum开发库的Platinum\Source\Platform\Android\module\platinum\jni\platinum-jni.cpp和

Platinum\Source\Tests\MediaRenderer\MediaRendererTest.cpp

platinum-jni.cpp

#include <assert.h>#include <jni.h>#include <string.h>#include <sys/types.h>#include "platinum-jni.h"#include "Platinum.h"#include <android/log.h>/*———————————————————————-| logging+———————————————————————*/NPT_SET_LOCAL_LOGGER("platinum.android.jni")/*———————————————————————-| functions+———————————————————————*/__attribute__((constructor)) static void onDlOpen(void){}/*———————————————————————-| JNI_OnLoad+———————————————————————*/JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved){NPT_LogManager::GetDefault().Configure("plist:.level=FINE;.handlers=ConsoleHandler;.ConsoleHandler.outputs=2;.ConsoleHandler.colors=false;.ConsoleHandler.filter=59");return JNI_VERSION_1_4;}/* * Class:com_plutinosoft_platinum_UPnP * Method: _init * Signature: ()J */JNIEXPORT jlong JNICALL Java_com_plutinosoft_platinum_UPnP__1init(JNIEnv *env, jclass){NPT_LOG_INFO("init");PLT_UPnP* self = new PLT_UPnP();return (jlong)self;}/* * Class:com_plutinosoft_platinum_UPnP * Method: _start * Signature: (J)I */JNIEXPORT jint JNICALL Java_com_plutinosoft_platinum_UPnP__1start(JNIEnv *, jclass, jlong _self){NPT_LOG_INFO("start");PLT_UPnP* self = (PLT_UPnP*)_self;return self->Start();}/* * Class:com_plutinosoft_platinum_UPnP * Method: _stop * Signature: (J)I */JNIEXPORT jint JNICALL Java_com_plutinosoft_platinum_UPnP__1stop(JNIEnv *, jclass, jlong _self){NPT_LOG_INFO("stop");PLT_UPnP* self = (PLT_UPnP*)_self;return self->Stop();}

MediaRendererTest.cpp#include "PltUPnP.h"#include "PltMediaRenderer.h"#include <stdlib.h>/*———————————————————————-| globals+———————————————————————*/struct Options {const char* friendly_name;} Options;/*———————————————————————-| PrintUsageAndExit+———————————————————————*/static voidPrintUsageAndExit(char** args){fprintf(stderr, "usage: %s [-f <friendly_name>]\n", args[0]);fprintf(stderr, "-f : optional upnp server friendly name\n");fprintf(stderr, "<path> : local path to serve\n");exit(1);}/*———————————————————————-| ParseCommandLine+———————————————————————*/static voidParseCommandLine(char** args){const char* arg;char**tmp = args+1;/* default values */Options.friendly_name = NULL;while ((arg = *tmp++)) {if (!strcmp(arg, "-f")) {Options.friendly_name = *tmp++;} else {fprintf(stderr, "ERROR: too many arguments\n");PrintUsageAndExit(args);}}}/*———————————————————————-| main+———————————————————————*/intmain(int /* argc */, char** argv){PLT_UPnP upnp;/* parse command line */ParseCommandLine(argv);PLT_DeviceHostReference device(new PLT_MediaRenderer(Options.friendly_name?Options.friendly_name:"Platinum Media Renderer",false,"e6572b54-f3c7-2d91-2fb5-b757f2537e21"));upnp.AddDevice(device);bool added = true;upnp.Start();char buf[256];while (gets(buf)) {if (*buf == ‘q’)break;if (*buf == ‘s’) {if (added) {upnp.RemoveDevice(device);} else {upnp.AddDevice(device);}added = !added;}}upnp.Stop();return 0;}

基于Platinum库的DMR实现(android)当中的jni类来尝试实现一下这两个接口

publicstaticnativeintstartMediaRender(byte[]friendname,byte[]uuid);

publicstaticnativeintstopMediaRender();

完成这一步,,DMR的实现就已经成功一半了

接下来我们要做的两件事就是

先看第一点,每当有action事件到来时,PLT_MediaRenderer的

只要你扬帆,便会有八面来风。启程了,人的生命才真正开始。

关于Platinum库的MediaRender具体C++代码实现探讨

相关文章:

你感兴趣的文章:

标签云: