亚洲欧美中文字幕在线网站 ,亚洲天堂中文网,亚洲欧美中文字幕5发布http://www.bjzhda.cnzh-cn曙海教育集團論壇http://www.bjzhda.cnRss Generator By Dvbbs.Netofficeoffice@126.comimages/logo.gif曙海教育集團論壇Android 實例http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2043&Page=1wangxinxin2010-12-3 13:02:17 gn7pIoN  
f'*HP%+Y  
從前面的登錄頁面跳轉進入添加賬單頁面.這個頁面主要是用來登記收支記錄的. R0{+Xd  
說白了就是往數據庫錄入明細. n0nkv[  
w Xfy,W  
表結構就是db.execSQL("CREATE TABLE bills (" Onby=Y o6  
"_ID INTEGER PRIMARY KEY," //id t4 h5R  
"fee integer," //費用 ,NKDEcw]  
"acctitemid integer," //賬目類型 h?fv :^vSi  
"userid integer," //使用者 r's4 -\  
"sdate TEXT," //日期 Bglh}_X  
"stime TEXT," //時間 M {_`X  
"desc TEXT" //備注 #W'jNX,h  
");"); $UgM7V$  
Q_qc_IcM y  
可以看到主要是錄入這些數據.首先是布置界面,我目前想到的用個tablelayout來布局 !2$O^ }6"  
最后布局就是如下圖這樣 Z Oyq{w!2  
#*1\h=bzmW  
圖1 gfFP-J3cN  
rW&8#&  
gNo.&G [  
/t(dhz&xN  
b-;+&Rb  
在這兒我首先需要設置賬目,前面我們已經初始化過賬目的數據. 8 U B?X  
賬目應該是一個ExpandableListActivity 2層的結構.需要從數據庫里面讀取.我在賬目后面放了一個editview 只讀沒有光標的.也就是在這兒不可錄入,在該editview的onclick事件里面我們打開賬目選擇界面.如下圖 tHJ#2X#Y.  
=k 2In_  
圖2 賬目選擇 0' @^PzX  
(B}+uI{  
k"LbB#Q  
ZYos.ay  
I;S[Ft8d  
在這個界面中點擊子節點就返回前面界面,把選擇的賬目傳遞過去.在這有個問題,如果用戶需要錄入的賬目沒有怎么辦? ik=~`3Zp0  
所以我這沒有用dialog方式而是用了ExpandableListActivity在這個界面中如果長點某個子節點就彈出管理賬目菜單, \`-/\N  
來維護賬目,如下圖所示: OQ;DqV  
圖3賬目選擇菜單示意 圖4 編輯賬目 ^z-e"  
`7zz&f9dDX  
,a9<\bd)  
HF" v \  
C\Qor3];  
-9Wx;u4]o  
kz\ D-b  
上面這些流程說起來很簡單,可是當我用andriod編寫時,遇到了很多問題,不過一個個都被我解決了,這正是編程的快樂所在. `VCU`Y  
關于ExpandableListActivity 大家可以參考android 里面apidemos 里面ExpandableList1,ExpandableList2,ExpandableList3 =/&ob%J)9]  
這里面對熟悉這個ui還是很有幫助的. 在ExpandableList2 里面就是從數據庫進行讀取的例子. 當然android里面那個我是沒太 ER~m &JI  
看明白因為他引用了import android.provider.Contacts.People; 聯系人部分的框架,而我目前對數據庫的操作和他不一樣,我都是直接 R ,-y  
sql訪問. Y O;N9wu3f  
但是你只要搞定2個cursor就ok了. Cursor groupCursor childCursor 其他都由SimpleCursorTreeAdapter幫你實現了. .<} (J#vC  
下面我們來看看如何使用SimpleCursorTreeAdapter t33/QW r  
//首先要實現groupcursor就是父節點游標,這個其實就是我的acctitem表的 ?W-J2tgss{  
//select * from accitem where pid is null 的結果 0 {#c  
Cursor groupCursor = billdb.getParentNode(); >MZWm6M8  
// Cache the ID column index ":E fR`A#  
mGroupIdColumnIndex = groupCursor.getColumnIndexOrThrow("_ID"); m,NUNd#)\  
// Set up our adapter 0j\?zt?  
mAdapter = new MyExpandableListAdapter(groupCursor, this, android.R.layout.simple_expandable_list_item_1, (~}IoQp>  
android.R.layout.simple_expandable_list_item_1, ]4wyuP,up  
new String[] { "NAME" }, // Name for group layouts zBD ?O!  
new int[] { android.R.id.text1 }, 8wz%e(  
new String[] { "NAME" }, // Lsa&A+fru  
new int[] { android.R.id.text1 }); Nr)v!z~y   
setListAdapter(mAdapter); spter35b[  
rUvjc4O}  
//然后我要實現childCursor 1M+o7HO.mG  
//其實就是select * from acctitem where id=pid 的結果 Wm>[5h%>  
public class MyExpandableListAdapter extends SimpleCursorTreeAdapter { <y#-I%ed  
public MyExpandableListAdapter(Cursor cursor, Context context, 1xN6V-qk  
int groupLayout, int childLayout, String[] groupFrom, Pf&\2_H3s9  
int[] groupTo, String[] childrenFrom, int[] childrenTo) j9"uxw@  
{ A;~lG3j4  
super(context, cursor, groupLayout, groupFrom, groupTo, c\"t+/Z  
childLayout, childrenFrom, childrenTo); +vOlA#t%Z  
} b[&A,ZPh$@  
protected Cursor getChildrenCursor(Cursor groupCursor) { m(MPVY<X  
String pid = groupCursor.getLong(mGroupIdColumnIndex) ""; $="t7C9S  
// Log.v("cola","pid=" pid); ~aKM+KmtPH  
return billdb.getChildenNode(pid); /5cFa  
} 9G njJ  
} R@*mMWW,  
//我們看看Billdbhelper里面的cursor _dQVundH  
public Cursor getParentNode(){ QwF\s13  
return db.query("acctitem", new String[]{"_id", "name" }, "pid is null", null, null, null, "pid,_id"); ;. jnRPo";  
Md!L@gX6<  
} ,3 !D(&  
xd[GJ;xvs  
public Cursor getChildenNode(String pid){ 61qs`N=k  
Log.v("cola","run getchildenNode"); KDx~^OO  
return db.query("acctitem", new String[]{"_id", "name" }, "pid=" pid, null, null, null, "_id"); +{b!,D3sa*  
} SVr3OyzI  
只要這幾步一個2級的tree list就可以出現了. >j5,Z]  
上面其實才是剛開始,后面我們需要使用一個自定義的Dialog 類似于一個inputBox 因為我們新增賬目是需要輸入賬目的名稱. \BIa:}9O  
就是上面圖4表現的. e_eNtVq  
雖然alertDialog提供了很多方法,可以選擇list,treelist,radio, 可惜就是不能錄入text. aT9+] Ig  
這里我參考了api demos 里面的 DateWidgets1.java 和源代碼里面DatePickerDialog.java . KyQO>g{R  
我們可以從alertdialog 繼承.然后添加一個Editview 最后把數據返回出來.只要把上面我說的2個java看清楚了后處理起來就簡單了. [73 \jT  
主要是一個回調函數的用法.下面看代碼 B=0U^wL  
// <F>^ffwGH-  
public class Dialog_edit extends AlertDialog implements OnClickListener { nRP|Qt7>  
private String text = ""; *=sMJY9#jE  
private EditText edit; 6Kl%|VrJs  
private OnDateSetListener mCallback; //定義回調函數 cst}/8e  
private LinearLayout layout; -<g&U*/E  
public interface OnDateSetListener {//回調接口 9.:]eL  
void onDateSet(String text); 3/aK#TjK  
} >,Z[IAU.x5  
protected Dialog_edit(Context context, String title, String value, Ipp#{'Do  
OnDateSetListener Callback) { Qkvg 85  
super(context); xJ$/#UdP  
mCallback = Callback; <:n !qQS6  
TextView label = new TextView(context); { R`"Nk  
label.setText("hint"); FI(iqSJ6  
// setView(label); wHR# -g'  
edit = new EditText(context); > u!# 4  
edit.setText(value); 0| }]=XN^  
layout = new LinearLayout(context); Gp9:#L!  
layout.setOrientation(LinearLayout.VERTICAL); \C}_l+nY  
// LinearLayout.LayoutParams param = [S_qi,  
// new LinearLayout.LayoutParams(100, 40); k d9<&.y{  
// layout.addView(label, param); '* eeup  
LinearLayout.LayoutParams param2 = new LinearLayout.LayoutParams(200, y,xJ5BI$  
50); ]ft}fU5C1  
layout.addView(edit, param2); .Y5o&at6s  
//添加edit !dV2:`|+  
setView(layout); ".7\>8A#a  
setTitle(title); 6qd?&.=r  
setButton("確定", this); P47 x-;  
setButton2("取消", (OnClickListener) null); /^sk y!  
} a7}O.NDf  
public void onClick(DialogInterface dialog, int which) { uqvS  
// Log.v("cola","U click which=" which); 2&zklXuo:  
text = edit.getText().toString(); -sxu7I  
Log.v("cola", "U click text=" text); hr W2#v  
if (mCallback != null) abw5Gz@Ag  
mCallback.onDateSet(text);//使用回調返回錄入的數據 @~bP|a  
} SQJ +C%   
} ^/I.? :+  
這樣我們就完成了自定義的dialog 我們可以使用它來新增和編輯賬目. 對于賬目的增刪改就是sql的事情了 LKBh{X0%(  
在這我又遇到一個問題就是我新增一個賬目后如何來刷新界面,從而反映賬目修改后的變化 S1#5oy2  
在這我開始以為只要使用getExpandableListView().invalidate(); 就可以了, =E62N7_`=  
因為我之前在ExpandableList1.java例子里面,使用它可以刷新界面. tgj 5l#P  
在那個例子里面我修改了數組后調用該方法,界面就刷新了,而在這SimpleCursorTreeAdapter就行不通了,我想 *D67&/g.  

]]>
Widget開發入門-Android平臺http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2042&Page=1wangxinxin2010-12-3 12:53:07
該嘰歪賬號是測試賬號,用戶名是“students”,密碼是“111111” 請不要擅自更改。

2. 建立一個Widget
Android reference中有關于如何建立一個Widget的詳細方法,這里簡要說明一下,詳情可以查看Android SDK中自帶的reference。

要建立一個Widget,分為如下幾個步驟:
(1) 創建一個類,讓其繼承類AppWidgetProvider,在AppWidgetProvider中有許多方法,例如onDelete(Context,int[]),onEnable(Context)等,但一般情況下我們只是覆寫onUpdate(Context,AppWidgetManager,int[])方法。在該方法中,我們啟動后臺服務的類,一般是啟動Thread類或者Android中的Service類。在該類中我們進行從服務器端獲得數據并進行處理并在Widget中顯示。

(2) 在你的AndroidMenifest.xml中添加一個receiver標簽,讓其指向你的AppWidgetProvider子類。內容如下:
<receiver android:name="JiwaiWidget"
android:label="@string/app_name"
android:icon="@drawable/jiwai">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
            android:resource="@xml/info" />
</receiver>
對上面的代碼進行解釋:
第一行指定該Widget的接收者是JiwaiWidget,即你建立的AppWidgetProvider子類;
第二行指定該Widget的標簽名稱,值為value目錄下string.xml中的app_name值;
第三行指定該Widget的圖標,值為drawable目錄下jiwai圖片;
第四行-第六行是采用Android文檔中提供的;
第七行指定該Widget的描述者信息,該描述著中定義了Widget的相關信息,如該Widget的寬度、長度、自動更新的間隔時間等信息,該描述位于xml目錄下的info.xml中。

(3) 編寫你的Widget的provider文件信息(本例中是xml/info.xml)
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="200dp"
    android:minHeight="90dp"
    android:updatePeriodMillis="43200000"
    android:initialLayout="@layout/appwidget"
    android:c>
</appwidget-provider>
其中android:updatePeriodMillis是自動更新的時間間隔,android:initialLayout是Widget的界面描述文件。Android:configure是可選的,如果你的Widget需要在啟動時先啟動一個Activity,則需要設定該項為你的Activity。本例中,需要你的嘀咕帳號和密碼,所以應先顯示一個Activity,輸入你的賬號和密碼,然后將得到的信息在你的Widget中顯示。

(4) 在layout目錄下編寫appwidget.xml文件,配置你的Widget的界面信息:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android圖片點擊可在新窗口打開查看rientation="vertical"
android:id="@+id/widget"
android:background="@drawable/title_a">
<LinearLayout android:layout_width="fill_parent"
android圖片點擊可在新窗口打開查看rientation="horizontal"
android:layout_height="wrap_content"
android:background="@drawable/title">
<TextView android:id="@+id/username_display"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:textColor="#ffffff"
android:textSize="15px"
android:gravity="left|center_vertical"
android:paddingLeft="6px" />
</LinearLayout>

<LinearLayout android圖片點擊可在新窗口打開查看rientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<TextView android:id="@+id/text1"
android:layout_width="fill_parent"
android:textColor="#ffffff"
android:textSize="12px"
android:gravity="center_vertical|left"
android:paddingLeft="6px"
android:layout_height="30px">
</TextView>

<TextView android:id="@+id/text2"
android:textColor="#ffffff"
android:layout_height="30px"
android:gravity="center_vertical|left"
android:textSize="12px"
android:paddingLeft="6px"
android:layout_width="fill_parent">
</TextView>
</LinearLayout>
</LinearLayout>


該Widget中包括三個Textview,兩個用來顯示嘰歪的信息,一個用來顯示用戶名,上述代碼比較簡單,故不做解釋。

(5) 由于需要一個Acvivity對象用來輸入賬戶信息,所以在layout目錄下新建一個login.xml,作為Activity的配置文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android圖片點擊可在新窗口打開查看rientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:textColor="#ff8c00"
android:capitalize="characters"
android:textStyle="bold" />

<LinearLayout android圖片點擊可在新窗口打開查看rientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">

<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/user"
android:textColor="#ff8cff"
android:capitalize="characters" />

<EditText android:id="@+id/username"
android:layout_width="200px"
android:layout_height="wrap_content" />

</LinearLayout>

<LinearLayout android圖片點擊可在新窗口打開查看rientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">

<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/code"
android:textColor="#ff8cff"
android:capitalize="characters" />

<EditText android:id="@+id/password"
android:layout_width="200px"
android:layout_height="wrap_content"
android:password="true" />
</LinearLayout>

<LinearLayout android圖片點擊可在新窗口打開查看rientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">

<Button
    android:id="@+id/submit"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Submit"   
    />
</LinearLayout>
</LinearLayout>
有兩個EditText用來輸入用戶名和密碼,另外還有一個Button對象。
]]>
谷歌面向普通Android用戶推出應用開發軟件http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2041&Page=1wangxinxin2010-12-3 12:30:29
以下內容含腳本,或可能導致頁面不正常的代碼
說明:上面顯示的是代碼內容。您可以先檢查過代碼沒問題,或修改之后再運行.
]]>
Android手機份額增長受益于蘋果與AT&T獨家協議http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2040&Page=1wangxinxin2010-12-3 12:01:52  上述兩位分析師都一致認為,盡管Android的成功離不開Google的諸多努力措施,但有一點可以肯定的是,Android成功的還包括一大主要原因——那就是蘋果iPhone只能在AT&T銷售。如果iPhone能在一年之前就同時著陸Verizon,那么Android如今可能已近乎無處可去。

  在塞格勒看來,上述觀點除了其與比奇之外,還會有更多人贊同。

  塞格勒表示,在過去的幾年中,其已經使用了6款不同的Android手機,盡管如此,塞格勒仍無法喜歡上Android手機。如今,新版的Android手機要比iPhone面世前的各種老版手機好了上百萬倍。對此,塞格勒認為,如果沒有iPhone的出現,其會毫不猶豫地選擇Android手機,并可能也會對Android產品感到滿意,但事實情況是,iPhone手機已經面世,而且其要優于Android,因此,塞格勒也開始動搖對Android的信念。

  塞格勒的觀點是:追求最好!但是,此分析師認為導致iPhone未被其視為最佳手機產品的主要原因就是AT&T的相關規定,并且為了擺脫這些規定,塞格勒又再次選擇了Android手機,而將iPhone暫時擱置一邊。

  塞格勒還表示,盡管iPhone的好多功能和外部特征都優于Android手機,甚至有一些Android手機的忠實支持者也會認為iPhone具有更好的用戶體驗,但這些支持者卻由于AT&T針對iPhone手機的一些規定和要求而再度選擇Android產品。例如,他們痛恨AT&T禁止在iPhone上使用Google Voice服務,對此塞格勒本人也非常痛恨。另外,這些支持者也痛恨蘋果公司在應用商店方面也設置重重障礙(塞格勒本人也對蘋果這些障礙政策持反對態度)。

  不過,也有多數消費者認為,這些都不是構成他們不喜歡iPhone的真正原因,他們甚至會對這些限制性措施視而不見,而他們的確不喜歡iPhone的真正原因就是因為AT&T公司(特別是在美國市場)。

  塞格勒總體認為,手機市場的競爭非常激烈,但對于iPhone登陸Verizon之后的銷量是否會大幅增長以及Android手機銷量是否會因此削弱,目前仍不得而知。不管是否會有大量的Android用戶會在iPhone登陸Verizon之后轉向iPhone手機,但無論如何,針對這種情形,Google一定會采取相應的應對措施

]]>
手機應用程序開發者盈利的方法http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2039&Page=1wangxinxin2010-12-3 12:00:36

據24次CNNIC報告,中國手機上網用戶為 1.81 億。其中手機上網人群占網民總數的46.0%
平均每人每天攜帶手機時間為14小時,同時47.3%的用戶平均每天通過手機上網2小時。消費者通過手機獲得信息的方式也被更多的人接受!手機已經逐漸成為一種新興的媒體平臺,基于這種新媒體平臺的營銷方式。
互聯網在中國已經是主流媒體,影響力堪比電視,但它的廣告收入只有電視的40%(09年網絡廣告為260億元,同期電視廣告位654億元)。一些廣告業內人士認為,網絡廣告的價值被大大低估了。

在Iphone 和Google等等這些互聯網應用功能極為強大智能手機,大量占領移動電話市場以后,我們有理由相信手機應用軟件市場也應運紅火起來。
應用程序開發者在經歷了不小的心理起伏。能從軟件可以登錄APP store又或是安卓應用程序市場銷售賺取一部分收入的欣喜,到漸漸的,他們所開發應用程序用戶的飽和,收入銳減的失落。
以往手機應用程序開發者從應用程序銷售平臺能賺取的收入是有限的。不論所開發的程序在用戶的日常生活中有多么的價值,每天使用的頻率有多么頻繁,使用時間有多長,畢竟從全體手機用戶的數量角度上講對于該程序的認知是很有限的。應用程序的消費者在為購買該程序的使用權一次性支付費用后,開發者就將不會從該手機程序中得到任何后繼收入。另外一些基于“2 8原則”位于“長尾”一端的分眾程序,開發者由販售程序所獲得收益將更加稀少。
時代在進步,更多的廣告主發現了手機對于用戶的影響之大超出通常的想象。更加在意手機終端廣告發布的有效性,于是中國覆蓋最廣的手機廣告平臺——“WOOBOO(中文名:哇棒)”應運而生。“WooBoo”手機廣告平臺就是順應了移動營銷的潮流和形式。

Wooboo手機廣告平臺是價值鏈透明、服務高效的發布平臺,它采用最低的門檻和最便捷的認證,軟件、游戲程序開發者通過和WooBoo操作系統的結合,植入廣告。
程序開發者可以本廣告平臺在程序中掛接廣告盈利,并可借此推廣自己的程序。而網站發布者通過在其網站上植入手機廣告輕松獲得利潤。
例如在最流行的IPhone手機平臺的中作為開發者,只需進行簡單的配置,就可以輕松的在開發的軟件應用或游戲中添加Wooboo目前訂制的廣告。Wooboo已經定制好的兩種廣告類型:漸入式和嵌入式。
只需要簡單五步就可以將Wooboo提供的廣告植入手機程序中:
1.注冊并獲取SDK。
1)訪問Wooboo官方網站http://www.wooboo.com.cn 注冊帳號。
2)登錄Wooboo帳號后,進入會員中心。
3)選擇左側功能樹“站點和程序”-->“添加站點\程序”。
4)選擇" iPhone程序", 按照提示輸入程序相關信息,功能介紹請
詳細填寫(后臺自動生成的關鍵字將有助于返回相應的廣告),完成
后,將得到一個唯一標識碼PublishedID和下載路徑。
注:同一程序中可以嵌入多個廣告視圖,但是需要指定同一個
Wooboo_PID。

2.添加sdk。
1)下載指定sdk程序包解壓后獲取共獲取6個程序文件,包括4個.h文
件和2個lib.a靜態庫文件。
2)將這些文件添加或導入到您的App工程目錄下,lib.a文件請選擇復
制,其中libSimu3_0.a用于模擬器終端,libDevice3_0.a用于真機終
端,您可以根據實際需要自行添加。
3)其次將項目所需framework添加到您的app中。

3.植入廣告。

4.發布程序。程序調試完成開發者就可以發布到AppStore或其他軟件商店,歡迎登錄Wooboo官方網站http://market.wooboo.com.cn發布最新的應用程序。

5.激活程序。請到Wooboo網站上更新應用程序 market URL進行激活,網站會校驗你的程序真實性,程序激活成功后開發者的應用程序就能收到Wooboo提供的廣告了。

Wooboo手機廣告平臺讓開發者的應用程序發揮更多的價值,能為開發者帶來更多切實的收益。是廣告主和程序開發者最佳的獲利平臺。]]>
Android在TQ2440開發板上的移植http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2038&Page=1wangxinxin2010-12-3 11:58:071.Android已經可以通過NFS在TQ2440開發板上運行
二、目前缺陷
1.觸摸屏沒有校準
2.Android中時鐘停止,結束zygote進程,系統重啟,時鐘更新,但再次停止不動
三、移植步驟
1、移植Android內核到TQ2440開發板上
1、從http://code.google.com/p/android/downloads/list上下載linux-2.6.25-android-1.0_r1.tar.gz
2、將內核解壓到用戶目錄,如/root/kernel.git
3、進入kernel.git文件夾,如cd ~/kernel.git/
4、修改arch/arm/plat-s3c24xx/common-smdk.c文件中的nand flash分區設置,如gedit arch/arm/plat-s3c24xx/common-smdk.c
修改static struct mtd_partition smdk_default_nand_part[]結構體為:
static struct mtd_partition smdk_default_nand_part[] = {
        [0] = {
                .name        = "TQ2440_uboot",
                .size        = 0x00040000,
                .offset        = 0x00000000,
        },
        [1] = {
                .name        = "TQ2440_kernel",
                .offset        = 0x0004C000,
                .size        = 0x00200000,
        },
        [2] = {
                .name        = "TQ2440_yaffs2",
                .offset        = 0x0024C000,
                .size        = 0x03DB0000,
        }
};
5、在http://www.codesourcery.com/gnu_toolchains/arm/portal/release644網站上下載IA32 GNU/Linux TAR。
6、將文件解壓到用戶目錄,如/usr/local/arm/arm-2008q3
7、進入arm-2008q3/bin文件夾,如cd ~/arm-2008q3/bin/
8、添加當前路徑進入環境變量,如export PATH=$PWD圖片點擊可在新窗口打開查看PATH,或修改~/.bashrc文件并重新登錄
9、進入內核文件夾,如cd ~/kernel.git/
10、修改Makefile文件,如gedit Makefile
更改ARCH和CROSS_COMPILE
#ARCH                ?= $(SUBARCH)
ARCH                ?= arm
#CROSS_COMPILE        ?= arm-eabi-
CROSS_COMPILE        ?= arm-none-gnueabi-
11、使用make s3c2410_defconfig,默認配置2410內核
12、運行make menuconfig
(1) 確保System Type ---> ARM system type ()中的內容為Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442, S3C2443
(2) 確保System Type ---> S3C2410 Machines --->
SMDK2410/A9M2410被勾選
(3) 取消選擇與Goldfish相關的內容
Device Drivers ---> Character devices ---> < > Goldfish TTY Driver
Device Drivers ---> Power supply class support ---> < >   Goldfish battery driver (NEW)
Device Drivers ---> Real Time Clock ---> < >   GOLDFISH (NEW)
Device Drivers ---> Graphics support ---> Support for frame buffer devices ---> < >   Goldfish Framebuffer
(4) 選擇S3C2410 LCD相關的內容
Device Drivers ---> Graphics support ---> Support for frame buffer devices ---> <*>   S3C2410 LCD framebuffer support
Device Drivers ---> Graphics support --->
Bootup logo --->
   Standard black and white Linux logo
Device Drivers ---> Graphics support --->
Bootup logo --->
   Standard 16-color Linux logo
Device Drivers ---> Graphics support --->
Bootup logo --->
   Standard 224-color Linux logo
(5) 選中Android內核必須選項
Kernel Features --->
Use the ARM EABI to compile the kernel
General setup --->
Use full shmem filesystem
General setup --->
Enable Android's Shared Memory Subsystem
System Type --->
Support Thumb user binaries
Device Drivers ---> Android --->
Android log driver
Device Drivers ---> Android ---> <*> Binder IPC Driver
(6) 盡量選中Android內核可選選項
Device Drivers ---> Android --->
RAM buffer console
Device Drivers ---> Android --->
Android timed gpio driver
Device Drivers ---> Android --->
Only allow certain groups to create sockets
(7) 其余CONFIG選項,如系統支持請一并選擇
CONFIG_ANDROID_POWER =y
CONFIG_ANDROID_POWER_STAT =y
CONFIG_ANDROID_POWER_ALARM =y
(可以在Kconfig文件中查找ANDROID_POWER等字段進行選擇,或者直接修改.config文件)
13、退出并保存.config
二、移植LCD驅動到Linux-2.6.25內核(驟二、三、四可以參照手冊,也可以參照我的其他文章)
TQ2440的LCD移植可參照本人的另外的文章:http://tq2440.5d6d.com/thread-4-1-1.html

三、移植觸摸屏驅動到Linux-2.6.25內核

        TQ2440的觸摸屏移植可參照本人的另外的文章:http://tq2440.5d6d.com/thread-5-1-1.html
將256行
        ts.dev->evbit[0] = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS);
        ts.dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT(BTN_TOUCH);
改為:
ts.dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
ts.dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
四、移植網卡驅動到Linux-2.6.25內核

        TQ2440的網卡移植可參照本人的另外的文章:http://tq2440.5d6d.com/thread-6-1-1.html

五、制作支持ARMv4的Android根文件系統
1、從http://www.namipan.com/d/403e5eb ... 140f0c9222be3858a02
下載Android的ARMv4版本根文件

2、在/dev下增加null和console兩個設備節點
mknod -m 660 null c 1 3
mknod -m 660 console c 5 1

3、在U-boot中修改啟動參數init為/init,完整的命令行如:

a,開機按住空格鍵
b,選[0] Set the boot parameters
c, [1] Set NFS boot parameter
d,輸入192.168.1.3(這個是你的pc的ip,我的是這個),回車
e, 輸入192.168.1.6(這個是板子ip,默認是這個),回車,輸入255.255.255.0
f, 再選[3] Set parameter,這個很重要,輸入bootargs,回車,輸入console=ttySAC0 root=/dev/nfs init=/init nfsroot=192.168.1.3:/opt/EmbedSky/root_nfs ip=192.168.1.6:192.168.1.3:192.168.1.6:255.255.255.0:tq2440.5d6d.com:eth0圖片點擊可在新窗口打開查看ff
g,保存重啟

注:TQ2440自帶的內核文件似乎在nfs啟動上有問題,建議參照第五步驅動網卡;/opt/EmbedSky/root_nfs 這個是你的nfs目錄,設置成你自己的
4、修改/init.rc文件,去除除mount tmpfs tmpfs /sqlite_stmt_journals size=4m之外的所有mount命令
系統制作完成,現在應該可以看到漂亮的大表了。首次啟動需要創建文件,TQ2440啟動還是比較快的,大約2分鐘。然后每次啟動只需要1分鐘。

后記:至此,android能夠驅動了,由于文件系統太大,做成文件系統有70多兆,2440只有64m空間,因此只能用nfs方式。哪天有時間將文件系統精簡一下或許能到64m一下,以后再專門寫吧!]]>
Android學習開發4--Android在C++中調用java(3)http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2037&Page=1wangxinxin2010-12-3 11:51:125.2 java類的實例化
都知道java需要 obj var = new obj();這樣一個過程,我們在C++中調用java類的成員函數,當然也要先示例話一個類。
示例化的函數如下所示
jobject getInstance(JNIEnv* env, jclass obj_class)
{
    jmethodID construction_id = env->GetMethodID(obj_class, "<init>", "()V");
    jobject obj = env->NewObject(obj_class, construction_id);
    return obj;
}
這個函數中的env表示環境參數,jclass表示一個java類的句柄。
jmethodID construction_id = env->GetMethodID(obj_class, "<init>", "()V");
GetMethodID的參數分別為(類句柄,方法名稱,參數名稱)
這個是為了獲取java類中某個方法的句柄,有一點需要特別注意的,在獲取構造方法的句柄和別的方法的句柄是不一樣的。
獲取一般方法的句柄所填寫“方法名稱”參數直接就是這個方法的名稱,而構造函數的話就必須填寫"<init>"。除了這點區別外,就沒有區別了。
而我們的“參數名稱”似乎寫的就有些奇怪了。但是細說下他的規律也就不怪了。
參數名稱的書寫規則為 (參數1類型,參數2類型….)返回類型。而相應類型的表示如下所示
圖片點擊可在新窗口打開查看

比如我們要找個int func(double)類型的函數,就該這么寫:
jmethodID construction_id = env->GetMethodID(obj_class, " func ", "(D)I");
找到了構造函數的方法之后我們直接調用構造函數,然后把生成的類返回即可
jobject obj = env->NewObject(obj_class, construction_id);
其中obj_class為類的句柄construction_id為構造函數的句柄,而類的實例被該函數返回。

5.3 調用java類的其他函數
JNIEXPORT jstring JNICALL Java_com_hm_hello_CActivityMain_stringFromJNI
(JNIEnv* env, jobject)
{
   jstring str;
   jclass java_class = env->FindClass("com/hm/hello/CForCall");
    if (java_class == 0)
    {
       return env->NewStringUTF("not find class!");
    }
   jobject java_obj = getInstance(env, java_class);
   if (java_obj == 0)
   {
       return env->NewStringUTF("not find java OBJ!");
   }
   jmethodID java_method = env->GetMethodID(java_class, "GetJavaString", "()Ljava/lang/String;");
   if(java_method == 0)
   {
       return env->NewStringUTF("not find java method!");
   }
   str = (jstring)env->CallObjectMethod(java_obj, java_method);
   return str;
}
看完了構造函數的介紹,這段代碼其實很容易就看懂了,我們發現調用java中的函數的步驟無非幾步:
1找到類句柄
2找到類的方法的句柄
3實例化類
4調用實例化類的方法。
而以上代碼中只有一段沒說過,就是
jclass java_class = env->FindClass("com/hm/hello/CForCall");
看名字就知道,是在找相應的類的句柄,其中com.hm.hello準備調用類的完整包名(把.轉換為/),而CforCall就是我們要調用的類的名稱。
至此,編譯,然后在Android調試,可愛的機器人又出現了,哈哈,屏幕上顯示出現了12345,成功!

]]>
谷歌將提供Android工具用戶可自行開發應用http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2036&Page=1wangxinxin2010-12-3 11:39:47
  這款軟件名為“谷歌Android應用發明家”(Google App Inventor for Android),在過去的一年中,谷歌一直在對該軟件進行測試,測試者主要為各專業學生人群。谷歌稱,之所以要推出這款工具,是因為人們對手機的依賴性越來越高,用戶應該學會自己開發所需程序。

  谷歌該項目主管、美國麻省理工學院計算機科學專家哈羅德·阿貝爾森(Harold Abelson)稱:“該項目的目標是讓普通手機用戶成為程序開發人員,而不僅僅是消費者。”

  該項目表明,谷歌相信開放策略有助于提升其在智能手機軟件市場的競爭優勢。相比之下,蘋果iPhone應用商店則對外部開發人員制定了極為嚴格的限制措施。阿貝爾森說:“谷歌之所以能夠這樣做,前提是Android是一個開放的架構。”

  阿貝爾森還舉例道,美國舊金山大學的一名學生利用該工具創建了一款短信回復程序。如果在駕車時收到短信,該應用程序就會自動回復:“我正開車,請不要給我發短信。”

  谷歌表示,希望為用戶,尤其是年輕用戶提供一個而簡單的工具,為智能手機開發軟件。今后,隨著該工具性能的提升,目標用戶群將有所擴大。

  該工具是一款基于Web的應用,僅適用于Android手機。使用前,用戶首先要登錄Gmail電子郵件帳號,然后下載一款體積很小的軟件。在創建應用程序時,必須將Android手機通過USB與電腦相連]]>
Android應用開發人員美國人最多黑莓和Windows Mobile應用商店收費最高http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2035&Page=1wangxinxin2010-12-3 11:36:43 Android應用開發人員美國人最多
 根據Distimo(應用商店分析工具提供商)近日發布的,12月份關于Android應用開發人員的調查,結果顯示有65%來自美國本土。其實稍加思索這樣的結果就不難解釋,不同于國內運營商的運營模式,美國用戶更習慣于付費購買正版軟件應用,而非國內的“破解”行為,而付費購買也正是軟件商店誕生的初衷。這顯然與國內仍然以流量計費的策略大相徑庭。這與Android軟件商店,在歐美地區的日均每款應用售價偏高的結果,也是一致的。
黑莓和Windows Mobile應用商店收費最高
 另一方面,Distimo的報告還比較了幾大主流軟件應用商店的售價。結果顯示最受企業用戶歡迎的手機應用平臺黑莓和Windows Mobile,它們的應用售價也最高。沒有意外的,共812款Windows Mobile應用中,美國以639款再次榮膺桂冠。




  

1264632164_bFh1SY.jpg (34.57 KB)

1264632164_bFh1SY.jpg

2412298499.jpg (30.2 KB)

2412298499.jpg

]]>
谷歌Android速覽 讓移動開發者輕松應用http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2034&Page=1wangxinxin2010-12-3 11:33:40Linux內核的Android作為專為移動設備開發的操作系統,并不只限于智能手機使用,還可以用在平板電腦、電子閱讀設備、甚至上網本上。

  如今,Google已將大部分的Android代碼發布于Apache軟件許可協議下。Apache軟件許可協議被公認為“企業友好”的許可證,它允許廠商擴展 具有專利性質的程序,而不必將擴展的程序提交回開源社區。

  為了開發這一系統,Google聯合了65家公司組成了一個企業聯盟并不是單槍匹馬來開發這個復雜的系統——Open Handset Alliance (OHA),并意欲為移動設備制定一套開放標準。其中包括英特爾,摩托羅拉,三星,LG等。

  OHA的宗旨是制定一個開放的平臺,徹底改變當今移動世界的操作模式。Andorid系統上“所有軟件生來平等”的原則給軟件的創作帶來了活力。這個原則意味著手機的核心程序和第三方程序享有平等的權利訪問手機的各種功能。

  作為開發人員,想去開發Android OS上的軟件,那么你則需要Android SDK。Android SDK由一套很復雜的開發工具組成。它支持所有的主要操作平臺(Windows, Mac, Linux)。 而開發軟件使用的主要語言是Java。然而,這些開發出的軟件并不是在普通的Java虛擬機上運行,而是在一個為Andorid 特別設計的虛擬機上運行,叫做Dalvik,它為只有有限的內存和CPU的電池供電的移動設備進行了專門的優化。這使得使用Java SE和ME編寫的Java程序和Android平臺上編寫的程序出現不兼容性。Android只是使用了Java語言的語法定義,它只支持提供Java SE和ME里的部分類庫和API。

  如果你認為程序性能是頭等大事,那你需要Android NDK,它是Android SDK的一個附加工具,可以使Android程序開發人員把他們的跟性能最相關的部分代碼編譯成本地代碼。

  Dalvik虛擬機上運行的程序一般都被打包成Dalvik(.dex)可執行格式,這些程序適合在那些內存和處理器受限制的系統上運行。從Android 2.2 版本后,Dalvik提供了一個即時編譯器,它能使程序的執行效率大大提高。跟大多數虛擬機上的代碼一樣,Dalvik上也有一個.DEX文件反編譯器,叫做Dedexer,同樣也是個開源軟件。

  我們必須要注意一點,Dalvik其實是使用Apache的Harmony項目的一個子集作為其核心類庫的。Apache Harmony是一個開源的、免費版的Java語言實現,它實現了Java SE 5和6的規范。

  新開發出的Android應用程序,不管是免費的還是商業的,你都可以從Android市場找到。 Android市場是一個Google開發的在線的軟件庫。 它提供了一個分類目錄,你可以把上面的應用程序通過在線方式下載安裝到你的目標設備上,而不需要使用PC機。 Android市場增長迅速,目前上面已經駐留了超過70,000個應用軟件(截至2010年六月)。

  Android目前的版本號是Froyo,此版本做了很多的改進,加入了很多新功能。 當然,開發人員們使用的SDK和NDK也有了很多的改進]]>
調查顯示70%iPhone平臺應用程序開發者有意為Android編寫程序http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2033&Page=1wangxinxin2010-12-3 11:32:20據  AdMob市調機構本周二的一份調查報告顯示,有超過70%的iPhone應用程序開發者都有計劃在未來的半年內為谷歌Android平臺開發應用程序。在此期間,走多平臺應用程序開發線路的開發者比例將由原來的31%提升到47%,其中有很大一部分開發者選擇將對Android的支持加入自己目前為其它系統編寫的程序中。另外,約有48%的Android應用程序開發者則計劃將對iPhone平臺的支持加入自己的程序中。

圖片點擊可在新窗口打開查看

圖片點擊可在新窗口打開查看



目前Android平臺的開發者比例已經略微領先于iPhone平臺,達到了51%比48%,而且還有68%的開發者表示半年內有可能會為Android平臺編寫應用程序。

另外,從這次AdMob的調查報告中,我們也可以看到各平臺應用程序開發者對自己目前所使用平臺的好惡程度。其中塞班和webOS平臺的程序開發者多數認為自己編寫的程序比較受用戶的歡迎,并計劃編寫更多的平臺應用程序。不過塞班平臺也是開發者最不喜愛的平臺。RIM的黑莓和J2ME平臺則相比之下受到了較多程序開發者的指摘。而Android和iPhone則是較受開發者喜愛的平臺]]>
Android應用程序開發常見問題匯總http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2032&Page=1wangxinxin2010-12-3 11:31:13
問:在平時Android開發時突然執行程序,出現了 Application does not specify a android.test.InstrumentationTestRunner instrumentation or does not declare uses- libraryandroid.test.runner的錯誤提示?
答:這主要是你在Run As中錯誤的選擇了目標為Android JUnit Test這項導致的,解決的方法也很簡單在Run Dialog中刪除JUnit Test這條即可。

===================================================
問:出現 NSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES的錯誤提示怎么辦?
答:這樣的問題主要是簽名沖突 造成的,比如你使用了ADB的debug權限簽名,但后來使用標準sign簽名后再安裝同一個文件會出現這樣的錯誤提示,解決的方法只有先老老實實從手機 上卸載原有版本再進行安裝,而adb install -r參數是無法解決這個問題。

====================================================
問:裝了Android 1.5版本后,發現過去的ADT 0.8版本插件無法自動更新怎么辦?
答:Google已經將Android進行了大的調整,我們安裝1.5版 SDK必需先先卸載過去的0.8或更早版本插件。
步驟為: 在Eclipse的菜單中找到 Help > Software Updates > Manage Configuration. 展開左邊樹圖,找到Android Editors 0.8.0.v200809220836-110569,單擊鼠標右鍵咋彈出的菜單中選擇Uninstall即可。

=====================================================
問:使用 Eclipse+ADT開發調試Android軟件時發現安裝一個apk文件出錯,出現類似Re-installation failed due to different application signatures.You must perform a full uninstall of the application. WARNING: This will remove the application data! Please execute 'adb uninstall om.android123.Demo' in a shell.的錯誤?
答:主要原因是ADT 插件賦予APK文件debug簽名時數字效驗出錯可能因為ADT版本不同、APK不是這臺計算機生產的在模擬器或Android手機上,解決的方法可以直 接在真機中刪除該程序,重新執行即可,或在shell中直接adb uninstall 后重新安裝。

=======================================================
問:Android 使用什么語言開發?
答:Android SDK僅提供了Java語言的開發包,但和Sun Java Micro Editon不兼容,需要使用Google Dalvik虛擬機可以識別的Java語言,更多參考Android SDK。目前不支持C/C++等其他語言,但通過ARM C++交叉編譯 器可以通過靜態庫方式在Android模擬器上執行本地C++程序,但最終由于權限等問題可能無法在Android手機上使用。

========================================================
問:無法對 jar 進行簽名:java.util.zip.ZipException: invalid entry compressed size (expected xxx but got xxx bytes)怎么辦?
答:這些問題主要是由于資源文件造成的,對于android開發來說 應該檢查res文件夾中的文件,逐個排查。這個問題可以通過升級系統的JDK和JRE版本來解決。。

==========================================================
問:Android程序為什么沒有退出設計
答:Google Android平臺在設計程序聲明周期上比較特殊,可能是考慮到第二次加載時保證速度的原因而沒有強制加入內存釋放問題,所有的資源回收由Dalvik GC自動完成,所以在設計開發時一定要注意Activity和 Service類的生命周期問題,顯示在最上層的窗口將有最高的優先級,當Android操作系統內存不夠用時自動將會根據歷史棧按優先級強制殺掉進程。

===========================================================
問: 開發過程中為什么Android系統去除了一些實用的類,比如Base64?
答:很早在Android.Util中我們可以看到Base64編碼 類,但是到了Android 0.9時轉移到了org.apache.http中,最后到了Android 1.0時去除了,但是系統仍然內部存在該類,Base64編碼除了在二進制文件傳輸有用外,系統的PIN密碼框加密也采用了Base64編碼,最終還是去 除了,我們可以通過自己實現對照表等方式來實現這個方法,比如在ESTMP這樣的郵件服務器中用戶名和密碼仍然需要Base64加密。

===========================================================
問:Can't upload xxx.apk問題怎么解決?
答:當前工程在編譯后沒有生成相關apk文件,apk文件一般位于工程的bin目錄下,里面還會存 放.class文件=>dex文件。Android開發網提醒這類錯誤IDE一般沒有提示錯誤信息,如果工程不是很龐大的話,可以重新創建一個工程 逐一分析。
]]>
Android-用 Eclipse 開發 Android 應用程序[一] : Android開發討論http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2031&Page=1wangxinxin2010-12-3 11:29:59文章關鍵詞:Android,教程,步驟,平臺,示例,插件,Eclipse,市場,兩個,環境

正文:

FiledUnder
Android是Google提供的挪動、無線、計算機和通訊平臺。經過使用AndroidEclipse插件,可以正在強大的Eclipse環境中構建Android應用步驟。本教程先容如何用Eclipse插件AndroidDevelopmentTools進行Android應用步驟開發,包括對Android平臺和AndroidDevelopmentTools的先容,并開發兩個示例應用步驟。
別的,您還可以經過教程“”,了解如何構建一個運轉正在Android平臺上的RSS閱讀器。



開端之前
本教程先容如何正在Eclipse環境中進行Android應用步驟開發,包括兩個示例應用步驟。第一個示例是一個基本的應用步驟,觸及構建和調試的一切階段。第二個應用步驟示例觸及相比雙雜的Android特,包括聯系人搜索和GoogleMaps地點查找。要想從本教程獲得最大收益,具備挪動開發經驗會有援助,但不是務必的。開發Android應用步驟需求Java?編程技能,但是對付本教程不是務必的。

我們為什么要關注Android?有兩個緣由使Android成為重要的平臺。首先,Google引進了Android,它正在很短光 內就獲得了市場的關注。Google正正在進軍挪動市場。它正在這個市場上接納的第一個行徑就是雄布Android和OpenHandsetAlliance,這是一個令人印象深進的起程點。第二,Android不但僅是另一種包括德律風、菜單和觸摸屏功能的挪動平臺。您將正在本教程中了解到,Android提供了一種差別的應用步驟開發要領。由于可以對懇求的作和代進行運轉時綁定,Android的體系結構支撐高度可定制的軟件環境。不管是考慮市場要素還是Android的技術方面,它都是一個值得鉆研的平臺。
本教程分為以下幾節:

本教程需求聯合使用幾種技術。
Eclipse是一個運轉插件的平臺。您該賣安置EclipseClassic的最新版本(本教程使用V3.3.1)。
憑據中的闡明安置AndroidDeveloperTools(Eclipse插件)。
本教程中的源代片斷包括:
CommentsLeaveaReply
Name(required)

EmailAddress(required)

Website
]]>
iPhone應用開發者開始轉向Android平http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2030&Page=1wangxinxin2010-12-3 11:28:26據國外媒體報道,與蘋果應用商店App Store相比,谷歌Android系統的手機應用表現平淡,且對用戶購買應用和開發人員盈利有諸多不便。但隨著谷歌Android操作系統的改變,越來越多的iPhone開發人員對開發Android操作系統應用表示出興趣。
《紐約時報》刊文表示,盡管Android手機銷量猛增,據谷歌稱每日激活數量達2萬部,但相比蘋果App Store來說,Android手機應用表現平淡。業內人士和開發人員表示,這其中部分是由于Android Market應用商店的一些做法阻礙了手機應用的銷售。比如,Android使用Google自己的在線支付系統Google Checkout,而不是諸如貝寶等更加流行的支付系統。這樣,許多Android開發人員不得不免費提供其應用下載,靠手機廣告收回成本。
由于谷歌的操作系統對手機制造商免費,所以市場上出現了大量各式各樣的Android手機,它們有不同屏幕尺寸、內存容量、處理器速度和圖形顯示能力,應用的兼容性會因此打一定折扣。比如,在摩托羅拉Droid手機中運行很好的應用可能會在HTC手機中遇到問題。而iPhone開發人員只需關注少數幾款產品:iPhone、iPod和iPad。
手機應用開發商Rovio的一名開發人員表示:“為Android開發手機應用要困難得多,因為面對蘋果操作系統,你只需關注一款產品,如iPhone。”
但是,隨著Android手機銷量持續提高,谷歌逐步對Android Market做出改進,Android手機應用的平淡表現正在改變。谷歌工程師副總裁安迪·魯賓(Andy Rubin)表示,目前有27萬開發人員為Android系統編寫手機應用,Android Market程序下載量已經超過10萬次,自今年3月以來增長了2倍。
開發人員也感到了這一變化。“我過去告訴別人我為Android系統編寫手機應用,別人會用異樣的眼神看我,”手機廣告軟件公司Medialets開發人員邁克爾·諾瓦克(Michael Novak)表示,“但一年前情況就有所變化了。現在,人們都知道Android是什么,它開始大受歡迎。”
谷歌表示未來有望在Android系統中引入交易功能,允許用戶在應用中購買產品,以幫助開發人員更加容易地賺錢。
分析師稱,在面對Windows 7這一新的競爭對手和iPhone強勢擴張的情況下,如果谷歌希望Android系統成功就必須做出改變,確保開發人員不會對Android系統失去耐心。
魯賓表示,面對激烈競爭,谷歌并不擔心,“Android承諾不限定在單一產品中應用,未來我們將會看到更多設備使用Android系統,且數量比人們想象的還要多]]>
Android手機應用商店步入2.0時代http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2029&Page=1wangxinxin2010-12-3 11:26:38趙劍表示,面向Android市場推出的新版愛米吧應用商店,已經把重點放在如何解決用戶最快速度找到自己喜愛的應用上,并在國內APP STORE中首個拿出應用個性化推薦解決方案。他認為,未來針對用戶喜好的個性化推薦將會成為APP STORE主要競爭的熱點。

市場競爭白熱化
今年最新的IDC報告顯示,2010年第二季度全球智能手機出貨量達到6300萬臺,同比增長50%。同時,IDC還預計,中國智能手機銷量將在年內達到2600萬部,較2009年增長約50%。來自市場分析機構的數據顯示,在已經是全球第二大智能手機市場的中國,僅僅今年第二季度就銷售了約47.5萬部Android手機,占整體銷量的7%,這個數據還不包括17.4萬部OMS智能手機。
爆發性增長的市場,以及蘋果在APP STORE上獲取的巨大商業成功,驅動國內包括運營商、手機廠商以及開發者蜂擁進入Android應用商店這一新興領地。
據了解,除了目前在市場上可見的機鋒網、巴士商店、安智市場等12個第三方應用商店外,包括華為、中興以及其他國內手機廠商以及運營商都在緊鑼密鼓的開發各自的Android應用商店。
“所有的APP STORE都在想盡辦法圈用戶,應用商店的安裝量決定了今后在市場的存活機率。”趙劍告訴記者。機鋒網副總裁徐威特表示,目前看來,幾家應用商店的模式并沒有太大差異,一場混戰在所難免。

用戶體驗進化2.0
Android應用商店不僅僅在爭奪所有能進入用戶手機的安裝渠道,也在產品的用戶體驗上做文章。今年推出的安智市場、掌上應用匯等應用商店,都在其中增加了最新應用版本升級自動提醒功能,由于比Android官方應用商店更新速度快,因此吸引了一部分用戶的眼球。不過,面對海量增長的應用數量,應用商店并沒有很好的解決方案。而數據顯示,Android應用數量僅用了3個月時間就從5萬增長到了10萬。
業內人士表示,面對海量的應用,國內應用商店采用的辦法都是排名、編輯推薦和搜索,根本無法解決個性化的需求。趙劍表示,愛米吧新版本中有猜你喜歡的個性化智能推薦系統,同時在搜索中加入了云標簽功能,會結合所有用戶的搜索熱點以及用戶本身的搜索熱詞顯示關鍵詞云,為用戶提供導航和一鍵進入的搜索結果。
趙劍表示,個性化推薦設計到對用戶行為的分析以及推薦算法的優化,也是改進應用商店用戶體驗的難點。]]>
Android入門教程(一)之------Android應用開發入門五問http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2028&Page=1wangxinxin2010-12-3 11:24:32
以下內容含腳本,或可能導致頁面不正常的代碼
說明:上面顯示的是代碼內容。您可以先檢查過代碼沒問題,或修改之后再運行.
]]>
Android 將要遠遠甩開 iOS?http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2027&Page=1wangxinxin2010-12-3 11:22:15平臺之爭永遠都是最吸引口水的題材。Gartner 和 IDC 這次發布的手機系統市場份額預測可能又將讓很多人參與到這場平臺的爭論之中。昨天 Gartner 在新聞稿中說“Android 將在 2010 年成為全球第二大手機操作系統,并將于 2014 年挑戰 Symbian 的全球第一地位”。
  Gartner 對于各大系統的終端數量(萬臺)及市場份額預測如下表所示:
系統
2009
2010
2011
2014
Symbian
8087.63
10766.24
14127.86
26435.18
市場份額(%)
46.9
40.1
34.2
30.2
Android
679.84
4746.21
9193.77
25930.64
市場份額(%)
3.9
17.7
22.2
29.6
Research In Motion
3434.68
4692.29
6219.82
10257.95
市場份額(%)
19.9
17.5
15.0
11.7
iOS
2488.98
4146.18
7074.00
13039.30
市場份額(%)
14.4
15.4
17.1
14.9
Windows Phone
1503.11
1268.65
2130.88
3449.02
市場份額(%)
8.7
4.7
5.2
3.9
其他操作系統
1043.19
1258.81
2601.73
8445.29
市場份額(%)
6.1
4.7
6.3
9.6
市場總量(萬臺)
17237.43   
26878.37   
41348.05   
87557.38   
  根據 Gartner 的預測,未來的手機市場將主要由 Symbian、Android、RIM 和 iOS 四家所掌控,微軟寄予厚望的 Windows Phone 7 仍不被看好。當然微軟內部并不這樣看待,他們認為 Windows Phone 7 的問世是給競爭對手的敲響的喪鐘。
  Symbian 之所以能夠繼續保持領先地位,得益于 Nokia 在全球大眾市場的巨大份額,尤其是在低端用戶的超高份額。在接下來兩天的 Nokia World 2010 中我們將會了解到換帥之后的 Nokia 是否會對 Symbian 和 Meego 兩大系統在未來的地位和戰略做出調整。
  Android 最近兩年一直發展迅猛,無數廠商都加入到 Android 的陣營一起對抗 iPhone 的超高人氣。由于這場戰爭是Google 聯合全球多家手機制造商對抗 Apple 一家,因此 Android 市場份額的節節攀升并不讓人奇怪。在Samsung、Motorola、LG、Sony Ericsson 等諸多廠商的支持下,今年年底 Android在北美的市場份額就將居于首位。而 iOS 雖然現在仍風靡全球,創新不斷且搶購如潮,但是我們也可以看到越來越多的果黑出現。因此 Gartner認為只有蘋果一家公司只有一款 iPhone 支撐的 iOS 份額仍會攀升,但是到 2014 年將會回落到 2010年的水平,而被搶占中低端市場的 Symbian 和 Android 甩在身后。
  RIM 和微軟雖然各自都研發并推出了自己的新系統 OS6 和 WP7,但是仍然不被看好,RIM 與 iOS一樣都只有自己一家硬件品牌的支撐,但是好在 RIM 的企業用戶基數較大,因此不會下滑到如微軟這般境地——微軟屆時將被 Meego超越而居第六位。而其他如三星推出的 Bada 以及 HP 和眾多胖友寄予厚望的webOS則統統被無視了,都只能到“其他操作系統”中找尋一點自己的份額。
  但是來自 IDC 的預測則與 Gartner 不盡相同,如下表所示:
操作系統
2010 市場份額
2014 市場份額
2014/2010變化
Symbian
40.1%
32.9%
-18.0%
BlackBerry OS
17.9%
17.3%
-3.5%
Android
16.3%
24.6%
51.2%
iOS
14.7%
10.9%
-25.8%
Windows Mobile
6.8%
9.8%
43.3%
其他
4.2%
4.5%
8.3%
總計
100.0%
100.0%
  IDC 認為即便到 2014 年 Android 仍難以追到 Symbian 的市場份額,雖然 Symbian有明顯的下滑(-18%),Android 有更顯著的爬升(51.2%)。然而雖然 Gartner 和 IDC對于具體份額預測不盡相同,但是從他們的預測數據來看,他們都認為到 2014 年 Android 將會把 iOS 遠遠拋在身后。
  而對于 RIM、iOS 以及 Windows Phone 的預測 IDC 則同樣與 Gartner 有不小的出入,IDC 認為 RIM的市場份額基本不會發生變化,而 iOS 則將下滑 25.8%,而將與份額急劇擴張之后的 Windows Phone 不相上下。對于 iOS的如此不看好相比會引起很多蘋果粉絲的不屑一顧,讓我們拭目以待究竟市場會如何變化,消費者和開發者又會如何選擇。]]>
android 應用類APP開發小結——android Google map 小應用http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2026&Page=1wangxinxin2010-12-3 11:20:59 

先上截圖:

 

應用的主要功能是根據適當的情景(如地點,手機狀態等)為用戶自動的切換情景模式。

比方說:手機向上是鈴音+震動,當開會時,將手機翻轉,將自動切換成靜音模式。

還可以根據經緯度,到達一個地方后自動切換成用戶預先設置的情景模式。

(當然,由于沒找到合適的經緯度換算工具,經緯度的判斷目前只能是精確位置,不是范圍值。

因此只能算是個學習的小應用了,實際的應用還有待完善啊。如果有高手知道的話,麻煩告訴我下。萬分感謝)

 

-------------------------廢話不多說開始代碼部分-----------------------------------------------------

雖然是一個只有一個頁面的小應用,但是

麻雀雖小,五臟俱全

這個應用的功能點主要有:

     改變情景模式

     實時獲取地理位置

     實時判斷手機重力狀態

用到的技術包括:

1.android Google map的應用

2.Android組件的使用
    Activity(MapActivity)
    Service
    Broadcastreceiver

3.Xml解析
4.文件存儲
5.傳感器使用
6.底層繪圖
7.自定義view

 

由于使回頭看代碼,我就從簡單的部分一步步介紹。

 

首先是權限問題,很多新手都犯了這個毛病,程序出錯,往往是權限沒有添加。

Java代碼 復制代碼
  1. <!-- 網絡鏈接 -->   
  2.    <uses-permission android:name="android.permission.INTERNET"/>   
  3.    <!-- 地圖 -->   
  4.    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>   
  5.    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>   
  6.    <!-- 讀寫權限 -->   
  7.    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />   
  8.    <uses-permission android:name="android.permission.WRITE" />  

 這個應用需要網絡連接的權限,因為Google map是實時更新的么。然后是GPS傳感器關于地理位置的權限。最后需要存儲用戶的記錄點,所以有文件讀寫的權限。

 

為了記錄用戶記錄的情景地點,我使用了XML作為存儲的標準,并將文件存在了SD卡上

XML解析

網絡上有很詳細的各種解析方式,我采用了其中的一種。如果想了解其他的請Google。。。。。

記錄地點信息,我定義了一個POJO類

Java代碼 復制代碼
  1. public class RecordLocation {   
  2.     private String location_Id;   
  3.     private String location_ring;   
  4.     private double location_latitude;   
  5.     private double location_longitude;   
  6.     private GeoPoint    point;   
  7. ...篇幅關系,其他的略  

 XML的解析器,和網絡上的其他文章一樣就不多說了。能拿來用就成。

Java代碼 復制代碼
  1. public List<RecordLocation> parse(String xml) {   
  2.         final RecordLocation currentMessage = new RecordLocation();   
  3.         RootElement root = new RootElement("Locations");   
  4.         final List<RecordLocation> messages = new ArrayList<RecordLocation>();   
  5.        // Element channel = root.getChild("RespInfo");   
  6.         Element item = root.getChild("Location");   
  7.         item.setEndElementListener(new EndElementListener(){   
  8.             public void end() {   
  9.                 messages.add(currentMessage.copy());   
  10.             }   
  11.         });   
  12.         item.getChild("id").setEndTextElementListener(new EndTextElementListener(){   
  13.             public void end(String body) {   
  14.                 currentMessage.setLocation_Id(body);   
  15.             }   
  16.         });   
  17.         item.getChild("ring").setEndTextElementListener(new EndTextElementListener(){   
  18.             public void end(String body) {   
  19.                 currentMessage.setLocation_ring(body);   
  20.             }   
  21.         });   
  22.         item.getChild("latitude").setEndTextElementListener(new  
  23.           EndTextElementListener(){   
  24.             public void end(String body) {   
  25.                 currentMessage.setLocation_latitude(Double.valueOf(body));   
  26.             }   
  27.         });   
  28.         item.getChild("longitude").setEndTextElementListener(new EndTextElementListener(){   
  29.             public void end(String body) {   
  30.                 currentMessage.setLocation_longitude(Double.valueOf(body));   
  31.             }   
  32.         });   
  33.   
  34.         try {   
  35.             InputStream   inputStream   =   new   ByteArrayInputStream(xml.getBytes());   
  36.             Xml.parse(inputStream, Xml.Encoding.UTF_8,   
  37.             root.getContentHandler());   
  38.         } catch (Exception e) {   
  39.             throw new RuntimeException(e);   
  40.         }   
  41.         return messages;   
]]>
Android輸入法開發實例解析http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2025&Page=1wangxinxin2010-12-3 11:16:442.五筆輸入法
  這里我們建立表名為CN,這里常規的字、詞組、五筆都可以使用同一張表,這樣對應查找更方便些,平時使用王碼的打字員輸入“ep”可以匹配出“愛”字,輸入“jqb”匹配出“昂”字。這里ep就是input字段,而昂就是value字段在表CN中,依次類推。
  3.英文輸入法
這個就更簡單了,把常用的單詞表全部放入到數據庫中,輸入a自動匹配apple、arm這樣的單詞,類似autocomplete是把,其實就是包含關系的,這里找個詞典直接導入即可。
4.聯想輸入法
  平時一個字一個字的輸入老慢,同樣我們不用很負責的算法,直接加入類似“zhongguo”對應“中國”這樣的詞組就OK了,經過Android123的初步測試SQLite數據庫在Android上還是蠻快的,但是還是不推薦這樣制作輸入法,至少商用產品不能這樣開發的。
5. 9宮格輸入法
平時不用G1附帶的QWERTY鍵盤打字時可以嘗試下新的9宮格輸入法,比如在傳統手機鍵盤上,我們可以發現1鍵對應的是符號,2鍵上刻有 a b c這三個字母,而9鍵上刻有 w x y z 這個四個字母,正常不用遍歷算法一樣可以直接記錄下按鍵順序,比如輸入“ding”這個拼音就是3464,而輸入“chen”就是2436,最后再使用方法4中的直接查翻譯過來就是中文字了,呵呵是不是很簡單呢?
三、選字設計
  這里我們充分發揮Android平臺的觸摸優勢,通過Gallery控件可以直接實現觸摸滾動,每個字我們可以當作一個TextView對待,因為都是派生于View類我們直接使用listener來攔截按下事件,就達到了觸摸選字,如果是QWERTY布局的話按鍵排列比較緊密,可以使用Android平臺提供的View類的長按listener來獲取長按事件,顯示一個放大的按下按鈕信息,這點可以參考iPhone手機的輸入法。
]]>
JNI技術與Android應用http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=45&ID=2024&Page=1wangxinxin2010-12-3 11:15:40    JNI是Java Native Interface的縮寫。從Java 1.1開始,JNI標準成為java平臺的一部分,它允許Java和其他語言進行交互。JNI一開始為C和C++而設計的,但是它并不妨礙你使用其他語 言,只要調用約定受支持就可以了。使用java與本地已編譯的代碼交互,通常會喪失平臺可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的,比 如,使用一些舊的庫,與硬件、操作系統進行交互,或者為了提高程序的性能。關于 JNI 的用法很簡單,有點像 java 里的 reflect 的工作機制,有興趣的朋友可以參看Java 本地接口規范 http://linux.computersci.net/art ... pec/jniTOC.doc.html
2.  Jni程序開發的一般操作步驟如下:
(1) 編寫帶有native聲明的方法的java類
(2) 使用javac 或 IDE(JBuilder,eclipse等)編譯所編寫的java類
(3) 使用javah -jni java類名生成擴展名為h的頭文件
(4) 使用C++ 實現本地方法,對調用簽名可用 javap –s –p [類全名] 查看(開發 C++ 動態鏈接庫本例是用的 VC6)
注意要從 JDK下面的 include 文件夾中把 jni.h和 jni_md.h 兩個文件 copy 到你的 VC 工程里
(5) 在 Java 中 load 動態鏈接庫文件,調用 native 方法.
或者說將項目依賴的所有原生庫和資源加入到java項目的java.library.path,生成java程序
3. 開發實例
(1). 編寫 Java 類:
package org.jm.jni;
import java.util.ArrayList;
public class BackgroundProcess {
static {
System.loadLibrary("org_jm_jni_BackgroundProcess");
}
// 三個 native 方法和一個 int 變量
public native boolean checkValid();
public native void processData(BackgroundProcess bg);
public native void processGarbage(String[] bg);
public int num = 5;
// C++ 中可以調用的方法
public String backProcess(ArrayList<String> p) {
System.out.println("這是 Java 里的方法,在 C++ 中調用。");
System.out.println("這個方法,是 java 中 native checkValid 方法調用的。");
return "look up process ->" + p;
}
public static void main(String[] args) {
String[] array = new String[4];
array[0] = "jack";
array[1] = "maggie";
array[2] = "rocket";
array[3] = "tom";
BackgroundProcess bgP = new BackgroundProcess();
// 調用 C++ DLL 中定義的方法。
bgP.checkValid();// 該方法回調 java 中的 backProcess 方法,即java::checkValid->c++::checkValid->java::backProcess
bgP.processData(bgP);
bgP.processGarbage(array);
// C++ DLL 改變了該變量
System.out.println("number 現在的值是: " + bgP.num);
}
}
2. 生成 C++ 的頭文件(javah 命令生成,用javap –s –p [類全名] 命令查看java 方法簽名)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class org_jm_jni_BackgroundProcess */
#ifndef _Included_org_jm_jni_BackgroundProcess
#define _Included_org_jm_jni_BackgroundProcess
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: org_jm_jni_BackgroundProcess
* Method: checkValid
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_org_jm_jni_BackgroundProcess_checkValid
(JNIEnv *, jobject);
/*
* Class: org_jm_jni_BackgroundProcess
* Method: processData
* Signature: (Lorg/jm/jni/BackgroundProcess;)V
*/
JNIEXPORT void JNICALL Java_org_jm_jni_BackgroundProcess_processData
(JNIEnv *, jobject, jobject);
/*
* Class: org_jm_jni_BackgroundProcess
* Method: processGarbage
* Signature: ([Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_org_jm_jni_BackgroundProcess_processGarbage
(JNIEnv *, jobject, jobjectArray);
#ifdef __cplusplus
}
#endif
#endif
    這里JNIEXPORT和JNICALL都是JNI的關鍵字,表示此函數是要被JNI調用的。例如jint是以JNI為中介使JAVA的int類型與本地 的int溝通的一種類型,我們可以視而不見,就當做int使用。函數的名稱是JAVA_再加上java程序的package路徑再加函數名組成的。參數 中,我們也只需要關心在JAVA程序中存在的參數,至于JNIEnv*和jclass我們一般沒有必要去碰它。
3. 開發 C++ DLL 的原文件 (記得要加入 jni.h 和 jni_md.h 兩個文件)
發布 DLL 文件, 我是配置了 path 環境變量
#include "org_jm_jni_BackgroundProcess.h"
#include <iostream.h>
#include <windows.h>
#include "string.h"
char* jstringTostring(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("utf-8");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
if (alen > 0)
{
rtn = (char*)malloc(alen + 1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr, ba, 0);
return rtn;
}
//char* to jstring
jstring stoJstring(JNIEnv* env, const char* pat)
{
jclass strClass = env->FindClass("Ljava/lang/String;");
jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
jbyteArray bytes = env->NewByteArray(strlen(pat));
env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
jstring encoding = env->NewStringUTF("utf-8");
return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
}
/*
* Class: org_jm_jni_BackgroundProcess
* Method: checkValid
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_org_jm_jni_BackgroundProcess_checkValid
(JNIEnv *env, jobject obj){
jclass bgpClass=env->GetObjectClass(obj);
jmethodID methodId=env->GetMethodID(bgpClass,"backProcess","(Ljava/util/ArrayList;)Ljava/lang/String;");
jobject str=env->CallObjectMethod(obj,methodId,NULL);
jfieldID fieldId=env->GetFieldID(bgpClass,"num","I");
jint number=env->GetIntField(obj,fieldId);
cout << "number 值是: " <<number << endl;
env->SetIntField(obj,fieldId,100L);
return 1;
}
/*
* Class: org_jm_jni_BackgroundProcess
* Method: processData
* Signature: (Lorg/jm/jni/BackgroundProcess;)V
*/
JNIEXPORT void JNICALL Java_org_jm_jni_BackgroundProcess_processData
(JNIEnv *env, jobject, jobject){
cout<< "this function do nothing " << endl;
}
/*
* Class: org_jm_jni_BackgroundProcess
* Method: processGarbage
* Signature: ([Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_org_jm_jni_BackgroundProcess_processGarbage
(JNIEnv *env, jobject, jobjectArray array){
jint size=env->GetArrayLength(array);
cout << "數組大小是: " << size << endl;
jstring tempObj=NULL;
char *pszSTR1 = NULL;
for(int i=0;i<size;i++){
cout << "current value is : " << i << endl;
tempObj=(jstring)env->GetObjectArrayElement(array,i);
const char * chars =env->GetStringUTFChars(tempObj, 0);
cout << chars << endl;
}
}
在此,針對andorid中c++與java中的方法互調,引用參考說明如下:
(1).andorid CPP調用java函數和訪問其成員:原理 => CPP代碼找到java的那個class里面的函數的入口地址,然后在CPP代碼中調用java代碼
步驟1) 用FindClass()函數找到該java類(如android.os.Binder)的實例對象的引用:
  jclass clazz = env->FindClass(kBinderPathName) = env->FindClass("android.os.Binder")
步驟2) 用GetFieldID()函數獲取到要訪問的域(field: 實際上就是該java class中的某個成員變量的名字)的ID:
  gBinderOffsets.mObject = env->GetFieldID(clazz, "mObject", "I") // mObject為java class "Binder"里的一個成員變量
  -> 注意,這里將要訪問的那個java對象的成員mObject的ID保存到了全局變量gBinderOffsets.mObject中,這樣做的前提和優點如下:
  前提: android里面,每個java進程中只允許有一個java虛擬機(sun公司原始的java架構中,一個進程中可以有多個java虛擬機)
  優點: 除了第一次,以后每次要訪問該java對象的成員mObject就非常快了(不用再去FindClass()和GetFieldID())
步驟3) 用GetMethodID()函數獲取到要訪問的方法(Method: 實際上就是該java class中的某個成員函數的名字)的ID:
  gBinderOffsets.mExecTransact = env->GetMethodID(clazz, "execTransact", "(IIII)Z") // execTransact為java class "Binder"里的一個成員函數
步驟4) 用類似于GetIntField()的函數獲取到該java對象的那個域(即成員)的值:
  IBinder* target = (IBinder*)env->GetIntField(obj,gBinderProxyOffsets.mObject)
     // 獲取java android.os.Binder類型對象里面的成員mObject的值
步驟5) 用類似于CallBooleanMethod()的函數調用到該java對象的那個成員函數:
  jboolean res = env->CallBooleanMethod(mObject, gBinderOffsets.mExecTransact, code, (int32_t)&data, (int32_t)reply, flags)
(2).android java調用CPP函數: 原理 => 相當于java的那個class里面有的函數使用CPP代碼來實現了
1)通過結構JNINativeMethod描述java代碼調用函數和CPP函數的對應關系:
  typedef struct {
  const char* name; // java代碼調用CPP函數的入口
  const char* signature; // CPP函數的返回值
  void* fnPtr; // CPP的函數名
  } JNINativeMethod;
  => 例如: java代碼通過IBinder.transact()來調用CPP的函數android_os_BinderProxy_transact()
  {"transact", "(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z", (void*)android_os_BinderProxy_transact},
2)將CPP函數注冊到java的某個class中: 使用函數AndroidRuntime::registerNativeMethods()來注冊
  => 這之后,java代碼就可以調用CPP函數了
3)java代碼調用CPP函數方法:
  IBinder.transact()
總結其原理:C/C++要調用JAVA程序,必須先加載JAVA虛擬機,由JAVA虛擬機解釋執行class文件。為了初始化JAVA虛擬機,JNI提供了一系列的接口函數,通過這些函數方便地加載虛擬機到內存中。
1). 加載虛擬機:
函數:jint JNI_CreateJavaVM(JavaVM **pvm, void **penv, void args);
參數說明:JavaVM **pvm JAVA虛擬機指針,第二個參數JNIEnv *env是貫穿整個調用過程的一個參數,因為后面的所有函數都需要這個參數,需注意的是第三個參數,在jdk1.1與1.2版本有些不同,在JDK 1.1中第三個參數總是指向一個結構JDK1_ 1InitArgs,這個結構無法完全在所有版本的虛擬機中進行無縫移植。所以為了保證可移植性,建議使用jdk1.2的方法加載虛擬機。
2). 獲取指定對象的類定義:
有兩種方法可獲得類定義,一是在已知類名的情況使用FindClass來獲取;二是通過對象直接得到類定義GetObjectClass
3). 獲取要調用的方法:
獲得非靜態方法:
jmethodID (JNICALL *GetMethodID)(JNIEnv *env, jclass clazz, const char *name, const char *sig);
獲得靜態方法:
jmethodID (JNICALL *GetStaticMethodID)(JNIEnv *env, jclass class, const char *name, const char *sig);
參數說明:JNIEnv *env初始化是得到的JNI環境;jclass class前面已獲取到的類定義;const char *name方法名;const char *sig方法參數定義
4). 調用JAVA類方法:
函數:CallObjectMethod(JNIEnv *env, jobject obj, jmethodID mid);
函數:CallStaticObjectMethod((JNIEnv *env, jobject obj, jmethodID mid);
5). 獲得類屬性的定義:
jfieldID (JNICALL *GetFieldID) (JNIEnv *env, jclass clazz, const char *name, const char *sig);
靜態屬性:
jfieldID (JNICALL *GetStaticFieldID) (JNIEnv *env, jclass clazz, const char *name, const char *sig);
6). 數組處理:
要創建數組首先要知道類型及長度,JNI提供了一系列的數組類型及操作的函數如:
NewIntArray、NewLongArray、NewShortArray、NewFloatArray、NewDoubleArray、 NewBooleanArray、NewStringUTF、NewCharArray、NewByteArray、NewString,訪問通過 GetBooleanArrayElements、GetIntArrayElements等函數。
7). 異常:
由于調用了Java的方法,會產生異常。這些異常在C/C++中無法通過本身的異常處理機制來捕捉到,但可以通過JNI一些函數來獲取Java中拋出的異常信息。
8).多線程調用
我們知道JAVA是非常消耗內存的,我們希望在多線程中能共享一個JVM虛擬機,真正消耗大量系統資源的是JAVA虛擬機jvm而不是虛擬機環境 env,jvm是允許多個線程訪問的,但是虛擬機環境只能被創建它本身的線程所訪問,而且每個線程必須創建自己的虛擬機環境env。JNI提供了兩個函 數:AttachCurrentThread和DetachCurrentThread。便于子線程創建自己的虛擬機環境。
4.  java與dll交互的技術
    目前java與dll交互的技術主要有3種:jni,jawin和jacob。Jni(Java Native Interface)是sun提供的java與系統中的原生方法交互的技術(在windows\linux系統中,實現java與native method互調)。目前只能由c/c++實現。后兩個都是sourceforge上的開源項目,同時也都是基于jni技術的windows系統上的一個 應用庫。Jacob(Java-Com Bridge)提供了java程序調用microsoft的com對象中的方法的能力。而除了com對象外,jawin(Java/Win32 integration project)還可以win32-dll動態鏈接庫中的方法。就功能而言:jni >> jawin>jacob,其大致的結構如下圖:
圖片點擊可在新窗口打開查看
就易用性而言,正好相反:jacob>jawin>>jni。
    Jvm封裝了各種操作系統實際的差異性的同時,提供了jni技術,使得開發者可以通過java程序(代碼)調用到操作系統相關的技術實現的庫函數,從而與 其他技術和系統交互,使用其他技術實現的系統的功能;同時其他技術和系統也可以通過jni提供的相應原生接口開調用java應用系統內部實現的功能。在 windows系統上,一般可執行的應用程序都是基于native的PE結構,windows上的jvm也是基于native結構實現的。Java應用體 系都是構建于jvm之上。
圖片點擊可在新窗口打開查看
    Jni對于應用本身來說,可以看做一個代理模式。對于開發者來說,需要使用c/c++來實現一個代理程序(jni程序)來實際操作目標原生函數,java程序中則是jvm通過加載并調用此jni程序來間接地調用目標原生函數。
圖片點擊可在新窗口打開查看
5. Android中jni的現有應用
(1).從如何載入.so檔案談起
由于Android的應用層的類都是以Java寫的,這些Java類編譯為Dex型式的Bytecode之后,必須靠Dalvik虛擬機(VM: Virtual Machine)來執行。VM在Android平臺里,扮演很重要的角色。此外,在執行Java類的過程中,如果Java類需要與C組件溝通時,VM就會 去載入C組件,然后讓Java的函數順利地調用到C組件的函數。此時,VM扮演著橋梁的角色,讓Java與C組件能通過標準的JNI介面而相互溝通。應用 層的Java類是在虛擬機(VM: Vitual Machine)上執行的,而C件不是在VM上執行,那么Java程式又如何要求VM去載入(Load)所指定的C組件呢? 可使用下述指令:
System.loadLibrary(*.so的檔案名);
例如,Android框架里所提供的MediaPlayer.java類,含指令:
public class MediaPlayer{
static {
System.loadLibrary("media_jni");
}
}
  這要求VM去載入Android的/system/lib/libmedia_jni.so檔案。載入*.so之后,Java類與*.so檔案就匯合起來,一起執行了。
]]>
主站蜘蛛池模板: 一级特黄色毛片免费看| 精品国产乱码久久久久久郑州公司| jizz中国免费| a级毛片免费高清视频| 99在线精品免费视频| 鲁啊鲁在线视频免费播放| 西西人体大胆免费视频| 网址你懂的在线观看| 男女一进一出猛进式抽搐视频| 清超市欲目录大团结| 欧美人与物VIDEOS另类| 日韩大片高清播放器| 成人无遮挡裸免费视频在线观看| 天天干天天干天天天天天天爽| 天天操天天操天天射| 国产精品无码V在线观看| 国产小视频网站| 公和我在厨房猛烈进出视频| 人妖系列免费网站观看| 亚洲人成人一区二区三区| 久久人人爽天天玩人人妻精品| 中文字幕影片免费在线观看| japanesehdfree人妻无码| 99久久精品费精品国产一区二区 | 亚洲精品午夜视频| 久久精品亚洲欧美va| 一区二区三区四区精品视频| 麻豆乱码国产一区二区三区| 精品无码国产自产拍在线观看蜜| 欧美激情一区二区三区蜜桃视频 | 狠狠色丁香久久婷婷综合| 最新国产AV无码专区亚洲| 成人免费视频观看无遮挡| 国产精品欧美一区二区三区| 国产亚洲漂亮白嫩美女在线 | 国产在线观看www鲁啊鲁免费| 啊轻点灬大ji巴太粗小说太男| 亚洲欧美国产精品完整版| 久久久99精品免费观看| 一区二区视频免费观看| 里番全彩本子库acg污妖王 |