20120531 dmsライブラリおよびUIの一時コード


現在,ndkファイルの作成と呼び出しが明らかになった.JNIがcppファイルの場合、cファイルとは異なり、extern cで処理する必要があります.その他は変わりません.
ライブラリ内の関数に移動できます.スレッドの作成も正常ですが、デバイスの起動時に異常が発生しました.元の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();


まとめてみると、内容はこれだけだった.
混乱していた多くの問題が明らかになった.
次の仕事は、設備の起動前後のすべての奥義を明らかにすることです.