學(xué)習Android需要掌握Java的知識
一、Java開(kāi)發(fā)需要掌握的基本知識
1、Java分為3個(gè)版本,對著(zhù)企業(yè)級應用的J2EE,針對嵌入式設備的J2ME,以及普通的J2SE。如果選擇不同的方向,就需要掌握不同的技術(shù)。
1.1、桌面應用程序:用JavaSE就夠了
1.2、項目開(kāi)發(fā):JavaEE(J2EE)
1.2.1 JavaEE
1.2.2 軟件工程
1.2.3 熟練的java編程技術(shù)(JAVA,JSP,JAVABEAN,JAVA SERVLET,XML),
1.2.4 大型數據庫編程經(jīng)驗,熟悉基于Oralce,DB2,SqlServer的應用的開(kāi)發(fā)
1.3、J2ME
2、通用的知識需要掌握,比如Java的基本語(yǔ)法,Eclipse,一些簡(jiǎn)單的設計模式等。
3、網(wǎng)站開(kāi)發(fā):需要html+CSS+javascript,XML等許多知識。
二、Android應用開(kāi)發(fā)需要掌握的基本知識
Java+sqlite +eclipse +android sdk +模擬器或者android手機
三、Mtk Android平臺開(kāi)發(fā)需要掌握的基本知識
1.Java /c /c++ 開(kāi)發(fā)語(yǔ)言知識(底層 +中間層 +上層應用層),Java部分知識參看《Java開(kāi)發(fā)指南2》。
2.Google Android 平臺在Java基礎上封裝的 接口、類(lèi)及相關(guān)Android 平臺的相應知識,參看《Android
平臺開(kāi)發(fā)之旅》。
3.MTK的release 文檔(MTK對Android平臺做了一次封裝,包括編譯、項目組成、驅動(dòng)集成),參看Mtk release的各平臺的code
&doc &tools。
4.如果還需要開(kāi)發(fā)應用部分代碼,要求=上述二中所描述,參看android SDK,《hello,android》。
5.如果還需要開(kāi)發(fā)驅動(dòng),需要學(xué)習 Linux操作系統、Mtk封裝的關(guān)于驅動(dòng)部分各平臺的code &doc &tools。
隨然這個(gè)問(wèn)題可能很多人都沒(méi)有遇到過(guò),但遇到過(guò)的朋友相信和我一樣,都經(jīng)過(guò)了一斷時(shí)間的問(wèn)題查找才解決,為了減少這樣的問(wèn)題給你帶來(lái)煩惱,在此我寫(xiě)下此文,希望對大家有所幫助。
你是否在創(chuàng )建JVM是老返回-1,即JNI_ERR;總么檢查程序都沒(méi)有發(fā)現任可問(wèn)題,編譯也不會(huì )出錯。 動(dòng)態(tài)鏈接庫文件“jvm。
dll”已經(jīng)放到了程序所在目錄了,其實(shí)問(wèn)題就出在這里,本來(lái)一般的dll文件只要把它放到執行程序目錄下就可以正常調用了,但jvm。dll卻有所不一樣,它還需要調用相對目錄下的其它文件,所以你不能單獨把jvm。
dll拷貝到exe所在的目錄;這樣雖然編譯均不會(huì )報錯,但執行是卻怎么也創(chuàng )建不了JVM。 正確的做法是,不要把jvm。
dll拷貝到exe所在的目錄,而是把“C:\jdk1。5。
0_03\jre\bin\client”(按具體的JDK安裝目錄和版本進(jìn)行設置)設到環(huán)境變量PATH中,這樣問(wèn)題就可以立即得到解決。
ava的本地調用jni。
調用c為例。在Windows下調用。
dll文件;在Linux下調用。so文件。
1 Java部分:寫(xiě)一個(gè)Java調用的方法。 注意:動(dòng)態(tài)庫的名字的寫(xiě)法: Windows環(huán)境: loadLibrary("libname"); 注意調用的時(shí)候要用全名,擴展名可以不寫(xiě)。
Linux環(huán)境: loadLibrary("name"); 注意調用的時(shí)候不要用全名,要去掉前面的lib和后面的擴展名。 編譯Java文件。
然后用Javah 生成。h文件給c程序用。
注意:如果Java文件又包的話(huà),生成的。h是不一樣的。
。h中的函數名會(huì )帶上包名。
例如:cn/common/testlib。Java,生成的。
h中的函數名前面會(huì )是:cn_common_testlib。如果沒(méi)有包,生成的。
h中的函數名就沒(méi)有cn_common_ 2 寫(xiě)好c程序,編譯生成。dll或。
so vc可以直接生成,或用命令行加參數的方法生成。 3 。
dll和。so放置的位置:libname。
dll/libname。so Windows環(huán)境: loadLibrary("libname"); 注意調用的時(shí)候要用全名,擴展名可以不寫(xiě)。
在環(huán)境變量設置PATH=%libname。dll的位置%,這樣Java即可找到自己定義的庫了。
Linux環(huán)境: loadLibrary("name"); 注意調用的時(shí)候不要用全名,要去掉前面的lib和后面的擴展名。 在環(huán)境變量設置:修改/etc下的profile文件加入這兩句: LD_LIBRARY_PATH=libname。
so的位置 export LD_LIBRARY_PATH 或者直接放在%Java_HOME%/jre/lib/i386/下面。
一、從Java調用C++的DLL 1。
創(chuàng )建Java文件 創(chuàng )建名為T(mén)estNative的Java文件,注意包名。 package org。
druze。test; publicclass TestNative { publicnativevoid sayHello(); publicvoid sayHello2(){ System。
out。println("Say Hello From Java"); } } 如代碼所示,對于sayHello方法聲明為native,這一部分將由C++的動(dòng)態(tài)庫來(lái)實(shí)現。
2。 生成class文件 使用javac org/druze/test/TestNative。
java生成class文件 注意:執行該命令在org所在目錄執行。 3。
使用javah命令生成相應的C++頭文件 使用javah org。druze。
test。TestNative生成名為 org_druze_test_TestNative。
h的頭文件 注意:執行該命令在org所在目錄執行。 該頭文件的內容如下: /* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class org_druze_test_TestNative */ #ifndef _Included_org_druze_test_TestNative #define _Included_org_druze_test_TestNative #ifdef __cplusplus extern "C" { #endif /* * Class: org_druze_test_TestNative * Method: sayHello * Signature: ()V */ JNIEXPORT void JNICALL Java_org_druze_test_TestNative_sayHello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif 4。
創(chuàng )建C++解決方案 此處以VS2008為例。 新建一個(gè)VC++的Win32項目,選擇如圖所示的控制臺應用程序。
項目名稱(chēng)為NativeCode。 點(diǎn)擊確定后,再點(diǎn)擊下一步,出現該頁(yè)面,應用程序類(lèi)型選擇DLL,附加選項選擇DLL 5。
創(chuàng )建號工程之后,將org_druze_test_TestNative。h導入到工程里面,并創(chuàng )建名為source。
cpp的源代碼,內容如下: #include"org_druze_test_TestNative。h" #include using namespace std; JNIEXPORT void JNICALL Java_org_druze_test_TestNative_sayHello(JNIEnv *env, jobject obj) { cout } 6。
在工具->選項->項目和解決方案->VC++目錄菜單中,平臺選擇Win32,選擇“顯示以下內容的目錄”為“包含文件”,導入jni。h和jni_md。
h的路徑。 7。
編譯,生成NativeCode。dll,并將其copy到環(huán)境變量PATH的路徑下。
8。 修改TestNative。
java package org。druze。
test; publicclass TestNative { publicnativevoid sayHello(); publicstaticvoid main(String[] args) { // 加載動(dòng)態(tài)連接庫DLL,如果沒(méi)有找到的話(huà),則會(huì )在運行時(shí)報錯 System。 loadLibrary("NativeCode"); TestNative tnt = new TestNative(); tnt。
sayHello(); } publicvoid sayHello2(){ System。out。
println("Say Hello From Java"); } } 運行,顯示“Hello World!” 9。 注意頭文件jni。
h和jni_md。h可以直接導入到工程中也可以。
10。注意NativeCode。
dll必須放置在java命令能訪(fǎng)問(wèn)的路徑中。 二、從C++調用Java 1.創(chuàng )建TestNative2。
Java package org。 druze。
test; publicclass TestNative2 { publicstaticvoid testPrint(){ System。out。
println("this is from static method"); } publicstaticint testReturn(){ return 22; } publicstaticint testInput(int number){ return 22+number; } publicint testInstance(int number){ System。 out。
println("this is from instance method"); return 11+number; } }。
[代碼] 步驟 #1:使用ANT編譯項目 NativeAdd.java01package org.apache;02 03import Android.util.Log;04 05public class NativeAdd {06 static {07 try {08 Log.i("JNI", "Trying to load libNativeAdd.so");09 System.loadLibrary("NativeAdd");10 }11 catch (UnsatisfiedLinkError ule) {12 Log.e("JNI", "WARNING: Could not load libNativeAdd.so");13 }14 }15 16 public static native long add(long a, long b);17} [代碼] 下面片斷給出主activity中如何調用這個(gè)類(lèi)/方法01public void onClick(View view) {02 Log.i(LOG_TAG, "onClick");03 04 EditText a = (EditText) findViewById(R.id.a);05 EditText b = (EditText) findViewById(R.id.b);06 EditText c = (EditText) findViewById(R.id.c);07 Log.i(LOG_TAG, "calling native method");08 long sum = NativeAdd.add( Long.parseLong(a.getText().toString()),09 Long.parseLong(b.getText().toString()));10 Log.i(LOG_TAG, "back from native method");11 String text = Long.toString(sum);12 c.setText("Native add returns = " + text.subSequence(0, text.length()));13 } [代碼] 步驟#2:運行下面的命令產(chǎn)生頭文件1javah -classpath ../../Android.jar;../bin/classes; org.apache.NativeAdd [代碼] 新產(chǎn)生的頭文件“(org_apache_CallNative.h”內容如下01/* DO NOT EDIT THIS FILE - it is machine generated */02#include03/* Header for class org_apache_NativeAdd */04 05#ifndef _Included_org_apache_NativeAdd06#define _Included_org_apache_NativeAdd07#ifdef __cplusplus08extern "C" {09#endif10/*11 * Class: org_apache_NativeAdd12 * Method: add13 * Signature: (JJ)J14 */15JNIEXPORT jlong JNICALL Java_org_apache_NativeAdd_add16 (JNIEnv *, jclass, jlong, jlong);17 18#ifdef __cplusplus19}20#endif21#endif [代碼] 步驟#3: 編寫(xiě)C文件如下“org_apache_NativeAdd.c”1#include "org_apache_NativeAdd.h"2 3JNIEXPORT jlong JNICALL Java_org_apache_NativeAdd_add4 (JNIEnv *env, jclass c, jlong a, jlong b)5{6 return a + b;7} [代碼] 步驟#5: 編譯和連接 org_apache_NativeAdd.c/org_apache_NativeAdd.h為一個(gè)共享庫.1arm-none-linux-gnueabi-gcc -I/usr/lib/jvm/java-1.5.0-sun/include -I/usr/lib/jvm/java-1.5.0-sun/include/linux -fpic -c org_apache_NativeAdd.c2arm-none-linux-gnueabi-ld -T armelf_linux_eabi.xsc -shared -o libNativeAdd.so org_apache_NativeAdd.o [代碼] 步驟 #6: 復制編譯文件到模擬器中. 同時(shí)安裝APK程序.view sourceprint?1adb push native/libNativeAdd.so /system/lib2adb install bin/CallNative.apk 你看下這是我自己做的時(shí)候一些經(jīng)驗 ,你看看是否對你有幫助。
聲明:本網(wǎng)站尊重并保護知識產(chǎn)權,根據《信息網(wǎng)絡(luò )傳播權保護條例》,如果我們轉載的作品侵犯了您的權利,請在一個(gè)月內通知我們,我們會(huì )及時(shí)刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學(xué)習?shū)B(niǎo). 頁(yè)面生成時(shí)間:89.789秒