20120531 dmsライブラリおよびUIの一時コード
現在,ndkファイルの作成と呼び出しが明らかになった.JNIがcppファイルの場合、cファイルとは異なり、extern cで処理する必要があります.その他は変わりません.
ライブラリ内の関数に移動できます.スレッドの作成も正常ですが、デバイスの起動時に異常が発生しました.元のdmsプログラムはコマンドラインの下で実行され、入力した文字やlogの出力に根拠があるがuiで起動すると、この根拠地が失われる疑いがある.
Build.sconsでは、次の構成が必要です.
ここで、dmsはダイナミックライブラリの名前であり、生成されたダイナミックライブラリはlibdms.soである.
ライブラリを生成する必要があるファイル:dmsJNI.cpp:
さらに、dms.javaはuiで使用するためにjavaクラスdmsを定義します.
uiでは、パッケージの宣言も必要です.
まとめてみると、内容はこれだけだった.
混乱していた多くの問題が明らかになった.
次の仕事は、設備の起動前後のすべての奥義を明らかにすることです.
ライブラリ内の関数に移動できます.スレッドの作成も正常ですが、デバイスの起動時に異常が発生しました.元のdmsプログラムはコマンドラインの下で実行され、入力した文字やlogの出力に根拠があるがuiで起動すると、この根拠地が失われる疑いがある.
Build.sconsでは、次の構成が必要です.
LibraryModule(name = 'dms',
build_source_files = {'Apps/dms':'dmsJNI.cpp'},
linked_modules = ['Platinum', 'PltMediaServer', 'PltMediaRenderer', 'PltMediaConnect'],
included_modules = ['Platinum', 'PltMediaServer', 'PltMediaRenderer', 'PltMediaConnect'],
source_root = 'Source',
shared = True,
install = True)
ここで、dmsはダイナミックライブラリの名前であり、生成されたダイナミックライブラリはlibdms.soである.
ライブラリを生成する必要があるファイル:dmsJNI.cpp:
#include <jni.h>
#include "Neptune.h"
#include "Platinum.h"
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
NPT_SET_LOCAL_LOGGER("platinum.media.server")
PLT_UPnP upnp;
PLT_DeviceHostReference device;
pthread_t thread;
static void* start_dms(void* thread_param)
{
// setup Neptune logging
NPT_LogManager::GetDefault().Configure("plist:.level=INFO;.handlers=ConsoleHandler;.ConsoleHandler.colors=off;.ConsoleHandler.filter=42");
NPT_LOG_INFO("baojinyu--------dms_lib---->start_dms.
");
device = new PLT_FileMediaServer("/data/local",
"UPnP Media Server");
NPT_List<NPT_IpAddress> list;
PLT_UPnPMessageHelper::GetIPAddresses(list);
//NPT_String ip = list.GetFirstItem()->ToString();
device->m_ModelDescription = "Platinum Media Server";
device->m_ModelURL = "http://www.plutinosoft.com/";
device->m_ModelNumber = "1.0";
device->m_ModelName = "Platinum Media Server";
device->m_Manufacturer = "Plutinosoft";
device->m_ManufacturerURL = "http://www.plutinosoft.com/";
upnp.AddDevice(device);
upnp.Start();
//NPT_CHECK_SEVERE(upnp.Start());
while(1)
{
}
return NULL;
}
static int stop_dms()
{
NPT_LOG_INFO("baojinyu--------dms_lib---->stop_dms.
");
//printf("baojinyu--------dms_lib---->stop_dms.
");
upnp.Stop();
return 0;
}
//------------
extern "C" {
JNIEXPORT int JNICALL Java_com_android_dlna_dms_dmsThreadBegin(JNIEnv *env, jobject obj);
JNIEXPORT int JNICALL Java_com_android_dlna_dms_dmsThreadEnd(JNIEnv *env, jobject obj);
};
JNIEXPORT int JNICALL
Java_com_android_dlna_dms_dmsThreadBegin(JNIEnv *env, jobject obj)
{
int retval;
retval = pthread_create(&thread, NULL, start_dms, NULL);
if(retval != 0)
{
NPT_LOG_INFO("create thread fail!
");
//printf("create thread fail!
");
return -1; //exit 。
}
else
{
NPT_LOG_INFO("pthread_create success.
");
}
return 0;
}
JNIEXPORT int JNICALL
Java_com_android_dlna_dms_dmsThreadEnd(JNIEnv *env, jobject obj)
{
stop_dms();
pthread_exit(NULL);//
//pthread_cancel(thread);// , ?
NPT_LOG_INFO("thread exit!
");
return 0;
}
さらに、dms.javaはuiで使用するためにjavaクラスdmsを定義します.
/**
* file: dms.java
* {@hide}
*/
package com.android.dlna;
public class dms
{
static {
System.loadLibrary("dms");
}
public static native int dmsThreadBegin();
public static native int dmsThreadEnd();
}
uiでは、パッケージの宣言も必要です.
package com.android.dlna;
関数の呼び出しは簡単です.dms.dmsThreadBegin();
dms.dmsThreadEnd();
まとめてみると、内容はこれだけだった.
混乱していた多くの問題が明らかになった.
次の仕事は、設備の起動前後のすべての奥義を明らかにすることです.