<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    倉(cāng)藍(lán)

    日記本

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      23 Posts :: 0 Stories :: 1 Comments :: 0 Trackbacks

    #

    隨著手機(jī)的功能越來(lái)越豐富,支持橫豎屏切換的手機(jī)越來(lái)越多,在手機(jī)軟件開(kāi)發(fā)中也必須要處理這個(gè)功能了。下面對(duì)于使用J2ME技術(shù)進(jìn)行編程時(shí)對(duì)于橫豎屏(轉(zhuǎn)屏)切換時(shí)的相關(guān)知識(shí)進(jìn)行一下小結(jié)。

    1、如何判斷橫豎屏切換

    橫豎屏切換由手機(jī)系統(tǒng)自動(dòng)完成的,在J2ME中只能檢測(cè)到這種變換,判斷橫豎屏切換的方法有2種:

    A)線程中每次檢測(cè)法(輪詢方式)

    這種方式是在程序的線程中每隔一定的時(shí)間間隔,就獲得一次屏幕的寬度和高度,然后判斷寬度和高度是否變化,如果寬度和高度和已有的寬度和高度相比發(fā)生了變化,至于是變化成橫屏還是豎屏則只需要比較寬高就可以實(shí)現(xiàn)。在判斷到橫豎屏切換時(shí),執(zhí)行邏輯代碼即可。

    使用這種方式由于每次線程循環(huán)都需要檢測(cè),所以執(zhí)行效率不高,但是由于一些轉(zhuǎn)屏手機(jī)不支持sizeChanged的方法回調(diào),所以使用這種方式的通用性是最高的,是經(jīng)常被使用的方法。

    B)sizeChanged法(中斷方式)

    這種方式是指如果轉(zhuǎn)屏手機(jī)對(duì)于MIDP支持比較規(guī)范,則當(dāng)橫豎屏切換時(shí)會(huì)自動(dòng)調(diào)用Canvas類中的sizeChanged方法,這樣就需要在Canvas的子類中覆蓋該方法即可,在該方法內(nèi)部書寫橫豎屏切換的邏輯處理代碼即可。

    使用這種方式由于是系統(tǒng)自動(dòng)調(diào)用,所以執(zhí)行效率很好,但是由于部分手機(jī)實(shí)現(xiàn)的不規(guī)范,所以通用性沒(méi)有第一種方式高。

    說(shuō)明:高級(jí)用戶界面自動(dòng)切換,不需要書寫處理的代碼。

    2、如何處理橫豎屏切換

    在檢測(cè)到橫豎屏切換以后,就需要對(duì)于橫豎屏切換進(jìn)行處理了,處理的方式一般有也有兩種:

    A)簡(jiǎn)單提示法

    這種處理方式時(shí)指只實(shí)現(xiàn)一種屏幕模式下的邏輯,而在另外一種屏幕方式下顯示提示。例如只實(shí)現(xiàn)豎屏模式的界面,在橫屏模式下,只出現(xiàn)提示:“請(qǐng)?jiān)谪Q屏模式下使用本程序”。

    使用這種方式程序?qū)崿F(xiàn)比較簡(jiǎn)單,只需要實(shí)現(xiàn)一套界面即可,適合于比較簡(jiǎn)單的程序。

    B)實(shí)現(xiàn)兩套UI法

    這種處理方式時(shí)指在一個(gè)程序中實(shí)現(xiàn)兩套界面:一套橫屏一套豎屏。可以在程序中設(shè)置一個(gè)screenType的參數(shù),在每個(gè)節(jié)目的繪制上海電磁閥方法中根據(jù)該參數(shù)判斷是橫屏還是豎屏,然后執(zhí)行不同的繪制代碼即可。

    使用這種方式程序?qū)崿F(xiàn)比較友好,但是程序開(kāi)發(fā)和測(cè)試的工作量都要稍微大一點(diǎn),而且橫豎屏切換時(shí)數(shù)據(jù)的變換也比較麻煩。

    3、其它說(shuō)明

    在實(shí)現(xiàn)橫豎屏切換時(shí),有些知識(shí)會(huì)幫助你實(shí)現(xiàn)一些很實(shí)用的功能:

    在Nokia手機(jī)上禁止橫豎屏切換:

    在S60 5th 及以上版本中,可以通過(guò)在jad或manifest文件中通過(guò)指定如下屬性來(lái)指定程序運(yùn)行時(shí)的屏幕類型:

    豎屏:Nokia-MIDlet-App-Orientation:portrait

    橫屏:Nokia-MIDlet-App-Orientation:landscape

    不足之處希望大家積極指正、交流和完善!


    posted @ 2012-02-07 10:53 cangshi 閱讀(308) | 評(píng)論 (0)編輯 收藏

      在網(wǎng)上廣為流傳的一份BlackBerry應(yīng)用程序開(kāi)發(fā)者指南里邊詳細(xì)介紹如何用BlackBerry API開(kāi)發(fā)BlackBerry application的各方面內(nèi)容。

      但是我們一般都是用Java ME開(kāi)發(fā),開(kāi)發(fā)出來(lái)的程序是jar格式,可以運(yùn)行在大部分型號(hào)的手機(jī)上。可是BlackBerry是不支持jar的,它支持的是cod格式。所以如果你想你開(kāi)發(fā)的Java ME程序運(yùn)行在BlackBerry上,就必須先把它轉(zhuǎn)為cod格式。

      要把一般Java ME程序轉(zhuǎn)為cod可以在程序開(kāi)發(fā)編譯過(guò)程序中轉(zhuǎn),也可以對(duì)打包好的jar轉(zhuǎn)。

      ◆對(duì)已經(jīng)打包好的jar文件轉(zhuǎn)為BlackBerrycod格式:進(jìn)入jar文件所在目錄,在cmd(命令行)中進(jìn)入相應(yīng)目錄,輸入下邊命令就可以了:引用rapc import="C:\Program Files\Research In Motion\BlackBerry JDE 4.2.1\lib\net_rim_api.jar" codename=TestBB jad=TestBB.jad TestBB.jar

      (注:這里rapc 是 C:\Program Files\Research In Motion\BlackBerry JDE 4.2.1\bin\ 目錄里的 rapc.exe, 如果環(huán)境變量沒(méi)有設(shè)置,這里就要用絕對(duì)路徑:C:\Program Files\Research In Motion\BlackBerry JDE 4.2.1\bin\rapc, 當(dāng)然你可以把它寫成一個(gè).bat文件來(lái)執(zhí)行。而網(wǎng)上你可以搜索到一個(gè)名為Java2Cod.exe的小程序可以直接轉(zhuǎn)換。)

      ◆在JDE中編譯程序:無(wú)論你是用BlackBerry API或者Java ME/midp API來(lái)開(kāi)發(fā)Java ME程序,都可以在JDE上編譯。最終他會(huì)自動(dòng)打包成cod文件。

      ◆在其IDE中編譯打包:因?yàn)槲沂怯肗etBeans來(lái)開(kāi)發(fā)的,所以本人只能提供NetBeans開(kāi)發(fā)BlackBerry程序的見(jiàn)解。而本人是在 NetBeans中用Java ME polish來(lái)整合開(kāi)發(fā)的。下邊介紹Java ME polish中開(kāi)發(fā)BlackBerry程序

      (可以參考http://www.j2mepolish.org/docs/platform-blackberry.html

      一、在Java ME polish安裝目錄里找到platforms.xml,在里邊的BlackBerry部分中,加上<capability name="build.Finalizer" value="jar2cod" />(我用的是Preview 2.0版本,里邊這一句是注釋掉,所以要把它activate,也可以在devices.xml中在你想用的emulator 屬性里加上這一句。如果沒(méi)有這一句編譯時(shí)就不會(huì)自動(dòng)把jar轉(zhuǎn)換為cod文件的.)

      polish里支持的版本最新系4.2.0,如果你安裝BlackBerry版本最新的如4.2.1/4.3.0,哪么你要把${BlackBerry目錄}/lib/net_rim_API.jar copy到${Java MEpolish}/import里,在platforms.xml的BlackBerry中修改<capability name="build.BootClassPath" value="net_rim_API.jar" />

      二、在工程的build.xml中添加blackberry.home屬性(你安裝的BlackBerry JDE目錄)

      Java代碼

    1. <property        name="blackberry.home" 
    2.  location="C:/Program Files/Research In Motion/BlackBerry JDE 4.2.1" /> 

      三、如果你編譯后打包的jad文件中缺少M(fèi)icroEdition-Configuration和MicroEdition-Profile兩個(gè)屬性是不能成功轉(zhuǎn)成cod文件的。這可以在工程的build.xml中的<build>屬性里的<jad>元素中添加:

      Java代碼

  • <jad>     <attribute target="jad" name="
    MicroEdition-Configuration"
     value="CLDC-1.1" 
  • if="polish.cldc11"/>     <attribute target="jad" 
    name=
    "MicroEdition-Profile" value="MIDP-2.0"/>    
  • </jad>

  •   四、如果你用了混淆器的(obfuscator),要把它unactivate,不要用它,因?yàn)锽lackBerry中的rapc轉(zhuǎn)換過(guò)程中會(huì)對(duì)程序混淆的。

      Java代碼

  • <obfuscator name="ProGuard" unless="test or polish.blackberry" >    
  • </obfuscator>
  •   五、在工程的build.xml中的<Java MEpolish>屬性requirements用你想編譯的BlackBerryemulator,如:

      Java代碼

  • <deviceRequirements>      
    <requirement name="Identifier" value="BlackBerry/8800" />              
  • </deviceRequirements>
  •   如果你的程序是一般的Java ME程序,那么就可以編譯運(yùn)行了。但如果你是用BlackBerry API開(kāi)發(fā)的上海柱塞閥,就要就把build.xml里<build>元素中的<midlet>,改為<main>,同時(shí)要添加polish.classes.midlet-1的variable。如:

      Java代碼

  • <!-- midlets definition -->   
    <main 
    class="com.protel.BlackBerryim.ui.BlackBerryIMMidlet" />     
  • <!-- project-wide variables - used for preprocessing  -->   
    <variables> <variable name=
    "polish.classes.midlet-1" value=" " />    
  • </variables>
  •   (注:polish.classes.midlet-1的value是" ",中間有一個(gè)空格的,我試過(guò)了,如果沒(méi)有這個(gè)定義變量或者這個(gè)值中間沒(méi)有空格,jar是不能轉(zhuǎn)為cod格式。)

      這是我初接觸BlackBerry時(shí)的一點(diǎn)心得。我用BlackBerry API在NetBeans+Java ME polish的環(huán)境下寫過(guò)一個(gè)test app,是能成功運(yùn)行的,希望對(duì)初接觸BlackBerry的朋友有幫助。

     


     

    posted @ 2012-02-03 22:32 cangshi 閱讀(366) | 評(píng)論 (0)編輯 收藏

    如何通過(guò)Java調(diào)用C/C++編寫第三方dll動(dòng)態(tài)鏈接庫(kù)解決方案分析。
    最近在用weka做一個(gè)數(shù)據(jù)挖掘相關(guān)的項(xiàng)目,不得不說(shuō),weka還是一個(gè)不錯(cuò)的開(kāi)放源代碼庫(kù),提供了很多最常用的分類和聚類算法。

    在我的項(xiàng)目中要用到一個(gè)聚類算法,Affinity Propagation(AP),由多倫多大學(xué)的Brendan J. Frey發(fā)表于2007年。相比其他的聚類算法,AP算法的聚類結(jié)果更加準(zhǔn)確。

    在AP的官方網(wǎng)站公布了AP算法的動(dòng)態(tài)鏈接庫(kù),我的目標(biāo)就是實(shí)現(xiàn)在Java工程中調(diào)用這個(gè)動(dòng)態(tài)鏈接庫(kù)。

    在網(wǎng)上查了資料,發(fā)現(xiàn),如果僅僅是想調(diào)用Windows的Native API還是比較省事的,這里我主要針對(duì)第三方dll的調(diào)用。

    下面進(jìn)入正題。

    這里主要用的方法是JNI。在網(wǎng)上查資料時(shí)看到很多人說(shuō)用JNI非常的復(fù)雜,不僅要看很多的文檔,而且要非常熟悉C/C++編程。恐怕有很多人在看到諸如此類的評(píng)論時(shí)已經(jīng)決定繞道用其他方法了。但是,假如你要實(shí)現(xiàn)的功能并不復(fù)雜(簡(jiǎn)單的參數(shù)傳遞,獲取返回值等等),我還是支持使用這個(gè)方法的。

    Java Native Interface,簡(jiǎn)稱JNI,是Java平臺(tái)的一部分,可用于讓Java和其他語(yǔ)言編寫的代碼進(jìn)行交互。下面是從網(wǎng)上摘取的JNI工作示意圖。


    圖1 JNI的工作模式

    下面就舉具體的例子說(shuō)明一下使用步驟:

    1) 編寫一個(gè)類,聲明native方法

    1. public class APCluster {   
    2.     public native int[] CallAPClusterDll( int         arg_Int,   
    3.                                           double[]    arg_DoubleArray,   
    4.                                           boolean     arg_boolean);  
    5.     static 
    6.     {  
    7.         System.loadLibrary("APClusterDllMedium");  
    8.     }  

    上面是APCluster.java文件,定義了一個(gè)APCluster類,其中有一個(gè)方法CallAPClusterDll(),需要傳遞三種不同類型的參數(shù),并且返回一個(gè)整型數(shù)組。

    注意,這里只需要聲明這個(gè)方法,并不需要實(shí)現(xiàn),具體實(shí)現(xiàn)就在APClusterDllMedium中。

    APClusterDllMedium就像中介一樣,Java通過(guò)調(diào)用這個(gè)中介Dll中的CallAPClusterDll方法,間接調(diào)用真正的第三方Dll。

    2)編譯生成.h文件

    第一步:

    javac APCluster.java 生成APCluster.class

    第二步:

    javah APCluster 生成APCluster.h頭文件,內(nèi)容如下:

    1. /* DO NOT EDIT THIS FILE - it is machine generated */ 
    2. #include <jni.h>  
    3. /* Header for class APCluster */ 
    4. #ifndef _Included_APCluster  
    5. #define _Included_APCluster  
    6. #ifdef __cplusplus  
    7. extern "C" {  
    8. #endif10 /*  
    9.  * Class:     APCluster  
    10.  * Method:    CallAPClusterDll  
    11.  * Signature: (I[DZ)[I  
    12.  */ 
    13. JNIEXPORT jintArray JNICALL Java_APCluster_CallAPClusterDll  
    14.   (JNIEnv *, jobject, jint, jdoubleArray, jboolean);  
    15. #ifdef __cplusplus  
    16. }  
    17. #endif21
    18. #endif 

    注意,APCluster.h這個(gè)頭文件的內(nèi)容是不能修改的,否則JNI會(huì)找不到相對(duì)應(yīng)的CallAPClusterDll()的實(shí)現(xiàn)。


    3)創(chuàng)建C/C++工程,實(shí)現(xiàn)CallAPClusterDll()方法。

    創(chuàng)建一個(gè)C/C++工程,工程名為APClusterDllMedium(其實(shí),生成的dll名為APClusterDllMedium即可),導(dǎo)入APCluster.h這個(gè)頭文件,并創(chuàng)建一個(gè)CPP文件,實(shí)現(xiàn).h文件中的方法。

     
    圖2 新建工程結(jié)構(gòu)

    由于我創(chuàng)建的工程是win32控制臺(tái)程序,所以最后默認(rèn)生成的是.exe文件,所以還要做一步工程屬性修改,讓它生成.dll后綴文件。

    打開(kāi)Project Property ->General,做以下修改:

     
    圖3 修改工程屬性

    下面就是實(shí)現(xiàn) JNIEXPORT jintArray JNICALL Java_APCluster_CallAPClusterDll (JNIEnv *, jobject, jint, jdoubleArray, jboolean); 這個(gè)方法了。先貼代碼再慢慢解釋吧。

    1. #include "APCluster.h"   
    2. #include <stdio.h>   
    3. #include <windows.h>  
    4. #ifdef __cplusplus   
    5. extern "C" {  
    6. #endif  
    7. typedef int*  (__stdcall *APCLUSTER32)(double*, unsigned int, bool);  
    8. JNIEXPORT jintArray JNICALL Java_APCluster_CallAPClusterDll  
    9.   (JNIEnv *env, jobject _obj, jint _arg_int, jdoubleArray _arg_doublearray, jboolean _arg_boolean)  
    10. {  
    11.     HMODULE dlh = NULL;  
    12.     APCLUSTER32 apcluster32;  
    13.     if (!(dlh=LoadLibrary("apclusterwin.dll")))        //第三方DLL位置  
    14.     {  
    15.         printf("LoadLibrary() failed: %d\n", GetLastError());   
    16.     }  
    17.     if (!(apcluster32 = (APCLUSTER32)GetProcAddress(dlh, "apcluster32")))    //具體調(diào)用apcluster32方法  
    18.     {  
    19.         printf("GetProcAddress() failed: %d\n", GetLastError());   
    20.     }  
    21.     int        m_int = _arg_int;  //類型轉(zhuǎn)換  
    22.     double*    m_doublearray = env->GetDoubleArrayElements(_arg_doublearray, NULL);  
    23.     bool       m_boolean = _arg_boolean;  
    24.     int* ret = (*apcluster32)(m_doublearray, m_int, m_boolean); /* actual function call */ 
    25.     jintArray result = env->NewIntArray(_arg_int);  
    26.     env->SetIntArrayRegion(result, 0, _arg_int, (const jint*)ret);  
    27.     FreeLibrary(dlh); /* unload DLL and free memory */ 
    28.     if(ret)   
    29.     {  
    30.          free(ret);   
    31.     }  
    32.     return result;  
    33. }  
    34. #ifdef __cplusplus  
    35. }  
    36. #endif 

    a)首先為了#include <jni.h>,必須添加JNI所在的目錄。

    打開(kāi)Project Property -> C/C++ -> General -> Additional Include Directories添加相應(yīng)目錄:

     
    圖4 添加JNI目錄

    b)在APCluster.h文件中自動(dòng)生成的函數(shù),只標(biāo)識(shí)了函數(shù)參數(shù)類型,為了引用這些參數(shù),自己起一個(gè)相應(yīng)的名字:

    JNIEXPORT jintArray JNICALL Java_APCluster_CallAPClusterDll
    (JNIEnv *env, jobject _obj, jint _arg_int, jdoubleArray _arg_doublearray, jboolean _arg_boolean) ......

    c)聲明函數(shù)指針,就是你要調(diào)用的第三方dll中函數(shù)的類型。

    d)LoadLibrary,導(dǎo)入真正的第三方Dll,并找到要調(diào)用的方法的函數(shù)地址。

    把這個(gè)函數(shù)地址賦值給函數(shù)指針,接下來(lái)就可以通過(guò)這個(gè)函數(shù)指針調(diào)用真正的apcluster函數(shù)了!

    e)類型轉(zhuǎn)換:

    讀讀jni.h文件就知道jdouble和double其實(shí)是一個(gè)東西,jboolean就是unsigned char類型,jni.h中是這么聲明的:

    1. typedef unsigned char    jboolean;  
    2. typedef unsigned short   jchar;  
    3. typedef short            jshort;  
    4. typedef float            jfloat;  
    5. typedef double           jdouble; 

    但是數(shù)組類型就沒(méi)有這么簡(jiǎn)單,獲取數(shù)組要使用類型相對(duì)應(yīng)的env->GetTypeArrayElement(jTypeArray...)。

    最后,要返回一個(gè)jint類型的數(shù)組,就要新創(chuàng)建一個(gè)此類型的數(shù)組,再為其賦值:

    1. jintArray result = env->NewIntArray(_arg_int);  
    2. env->SetIntArrayRegion(result, 0, _arg_int, (const jint*)ret); 

    其中,_arg_int代表的是創(chuàng)建數(shù)組的長(zhǎng)度。

    最后return result。

    4)Build這個(gè)工程。

    Build,生成相應(yīng)的APCluster.dll文件,將這個(gè)dll放到j(luò)ava工程目錄下。

     
    圖5 將生成的dll放到j(luò)ava工程下

    5)編寫測(cè)試java程序,調(diào)用dll庫(kù)。

    以下為測(cè)試程序,Test.java:

    1. public class Test    
    2. {  
    3.     public static void main(String[] args)   
    4.     {   
    5.         double     arg_doublearray[] = {0.10.20.3};   
    6.         int        arg_int = 3;   
    7.         boolean    arg_boolean = true;   
    8.         int[]  result = new APCluster().CallAPClusterDll(arg_int, arg_doublearray, arg_boolean);  
    9.         .....  
    10.     }  

    到此,java調(diào)用第三方dll就基本完成了。

    本文也主要是介紹大概的操作流程,至于具體應(yīng)該使用哪些API就只有去研究官方文檔了。

    另外還有一些需要注意的問(wèn)題,比如64位的程序去調(diào)用32位的dll會(huì)報(bào)錯(cuò)啊等等...這些都是細(xì)節(jié)問(wèn)題了。

    最后,個(gè)人認(rèn)為,自己動(dòng)手實(shí)踐還是很重要,網(wǎng)上都說(shuō)這個(gè)復(fù)雜那個(gè)難,但是至于難還是不難,還是要實(shí)踐了才知道...不能不去嘗試...

    posted @ 2012-02-02 22:44 cangshi 閱讀(1122) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題
    共3頁(yè): 上一頁(yè) 1 2 3 
    主站蜘蛛池模板: 亚洲一区二区三区在线观看精品中文 | 曰韩亚洲av人人夜夜澡人人爽| 亚洲成AV人片在线观看| 在人线av无码免费高潮喷水| 玖玖在线免费视频| 亚洲AV无码一区二区三区鸳鸯影院| 亚洲自偷自拍另类12p| 国产亚洲综合色就色| 免费人成视频x8x8入口| 在线免费观看伊人三级电影| 久久亚洲精品无码av| 国产亚洲精品自在久久| 免费在线观看污网站| 啦啦啦在线免费视频| 18勿入网站免费永久| 91免费国产精品| 久久免费美女视频| 免费精品久久天干天干| eeuss影院免费92242部| 人妻免费久久久久久久了| 国产亚洲精品精品精品| 国产亚洲欧美日韩亚洲中文色| 456亚洲人成在线播放网站| 亚洲国产精品无码久久久| 久久精品国产亚洲AV大全| 亚洲高清国产AV拍精品青青草原| 亚洲人成人网站在线观看| 免费播放春色aⅴ视频| 国产伦精品一区二区三区免费下载 | 4444www免费看| 免费视频精品一区二区三区 | 国产精品久久久亚洲| 亚洲欧洲精品无码AV| 亚洲乱码精品久久久久..| 亚洲精品成人区在线观看| 亚洲精品高清一二区久久| jlzzjlzz亚洲乱熟在线播放| 亚洲爽爽一区二区三区| 国产aⅴ无码专区亚洲av麻豆 | 72pao国产成视频永久免费| 一个人看www免费高清字幕|