學(xué)習(xí)Android需要掌握J(rèn)ava的知識(shí)
一、Java開發(fā)需要掌握的基本知識(shí)
1、Java分為3個(gè)版本,對著企業(yè)級應(yīng)用的J2EE,針對嵌入式設(shè)備的J2ME,以及普通的J2SE。如果選擇不同的方向,就需要掌握不同的技術(shù)。
1.1、桌面應(yīng)用程序:用JavaSE就夠了
1.2、項(xiàng)目開發(fā):JavaEE(J2EE)
1.2.1 JavaEE
1.2.2 軟件工程
1.2.3 熟練的java編程技術(shù)(JAVA,JSP,JAVABEAN,JAVA SERVLET,XML),
1.2.4 大型數(shù)據(jù)庫編程經(jīng)驗(yàn),熟悉基于Oralce,DB2,SqlServer的應(yīng)用的開發(fā)
1.3、J2ME
2、通用的知識(shí)需要掌握,比如Java的基本語法,Eclipse,一些簡單的設(shè)計(jì)模式等。
3、網(wǎng)站開發(fā):需要html+CSS+javascript,XML等許多知識(shí)。
二、Android應(yīng)用開發(fā)需要掌握的基本知識(shí)
Java+sqlite +eclipse +android sdk +模擬器或者android手機(jī)
三、Mtk Android平臺(tái)開發(fā)需要掌握的基本知識(shí)
1.Java /c /c++ 開發(fā)語言知識(shí)(底層 +中間層 +上層應(yīng)用層),Java部分知識(shí)參看《Java開發(fā)指南2》。
2.Google Android 平臺(tái)在Java基礎(chǔ)上封裝的 接口、類及相關(guān)Android 平臺(tái)的相應(yīng)知識(shí),參看《Android
平臺(tái)開發(fā)之旅》。
3.MTK的release 文檔(MTK對Android平臺(tái)做了一次封裝,包括編譯、項(xiàng)目組成、驅(qū)動(dòng)集成),參看Mtk release的各平臺(tái)的code
&doc &tools。
4.如果還需要開發(fā)應(yīng)用部分代碼,要求=上述二中所描述,參看android SDK,《hello,android》。
5.如果還需要開發(fā)驅(qū)動(dòng),需要學(xué)習(xí) Linux操作系統(tǒng)、Mtk封裝的關(guān)于驅(qū)動(dòng)部分各平臺(tái)的code &doc &tools。
隨然這個(gè)問題可能很多人都沒有遇到過,但遇到過的朋友相信和我一樣,都經(jīng)過了一斷時(shí)間的問題查找才解決,為了減少這樣的問題給你帶來煩惱,在此我寫下此文,希望對大家有所幫助。
你是否在創(chuàng)建JVM是老返回-1,即JNI_ERR;總么檢查程序都沒有發(fā)現(xiàn)任可問題,編譯也不會(huì)出錯(cuò)。 動(dòng)態(tài)鏈接庫文件“jvm。
dll”已經(jīng)放到了程序所在目錄了,其實(shí)問題就出在這里,本來一般的dll文件只要把它放到執(zhí)行程序目錄下就可以正常調(diào)用了,但jvm。dll卻有所不一樣,它還需要調(diào)用相對目錄下的其它文件,所以你不能單獨(dú)把jvm。
dll拷貝到exe所在的目錄;這樣雖然編譯均不會(huì)報(bào)錯(cuò),但執(zhí)行是卻怎么也創(chuàng)建不了JVM。 正確的做法是,不要把jvm。
dll拷貝到exe所在的目錄,而是把“C:\jdk1。5。
0_03\jre\bin\client”(按具體的JDK安裝目錄和版本進(jìn)行設(shè)置)設(shè)到環(huán)境變量PATH中,這樣問題就可以立即得到解決。
ava的本地調(diào)用jni。
調(diào)用c為例。在Windows下調(diào)用。
dll文件;在Linux下調(diào)用。so文件。
1 Java部分:寫一個(gè)Java調(diào)用的方法。 注意:動(dòng)態(tài)庫的名字的寫法: Windows環(huán)境: loadLibrary("libname"); 注意調(diào)用的時(shí)候要用全名,擴(kuò)展名可以不寫。
Linux環(huán)境: loadLibrary("name"); 注意調(diào)用的時(shí)候不要用全名,要去掉前面的lib和后面的擴(kuò)展名。 編譯Java文件。
然后用Javah 生成。h文件給c程序用。
注意:如果Java文件又包的話,生成的。h是不一樣的。
。h中的函數(shù)名會(huì)帶上包名。
例如:cn/common/testlib。Java,生成的。
h中的函數(shù)名前面會(huì)是:cn_common_testlib。如果沒有包,生成的。
h中的函數(shù)名就沒有cn_common_ 2 寫好c程序,編譯生成。dll或。
so vc可以直接生成,或用命令行加參數(shù)的方法生成。 3 。
dll和。so放置的位置:libname。
dll/libname。so Windows環(huán)境: loadLibrary("libname"); 注意調(diào)用的時(shí)候要用全名,擴(kuò)展名可以不寫。
在環(huán)境變量設(shè)置PATH=%libname。dll的位置%,這樣Java即可找到自己定義的庫了。
Linux環(huán)境: loadLibrary("name"); 注意調(diào)用的時(shí)候不要用全名,要去掉前面的lib和后面的擴(kuò)展名。 在環(huán)境變量設(shè)置:修改/etc下的profile文件加入這兩句: LD_LIBRARY_PATH=libname。
so的位置 export LD_LIBRARY_PATH 或者直接放在%Java_HOME%/jre/lib/i386/下面。
一、從Java調(diào)用C++的DLL 1。
創(chuàng)建Java文件 創(chuàng)建名為TestNative的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)庫來實(shí)現(xiàn)。
2。 生成class文件 使用javac org/druze/test/TestNative。
java生成class文件 注意:執(zhí)行該命令在org所在目錄執(zhí)行。 3。
使用javah命令生成相應(yīng)的C++頭文件 使用javah org。druze。
test。TestNative生成名為 org_druze_test_TestNative。
h的頭文件 注意:執(zhí)行該命令在org所在目錄執(zhí)行。 該頭文件的內(nèi)容如下: /* 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項(xiàng)目,選擇如圖所示的控制臺(tái)應(yīng)用程序。
項(xiàng)目名稱為NativeCode。 點(diǎn)擊確定后,再點(diǎn)擊下一步,出現(xiàn)該頁面,應(yīng)用程序類型選擇DLL,附加選項(xiàng)選擇DLL 5。
創(chuàng)建號工程之后,將org_druze_test_TestNative。h導(dǎo)入到工程里面,并創(chuàng)建名為source。
cpp的源代碼,內(nèi)容如下: #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。
在工具->選項(xiàng)->項(xiàng)目和解決方案->VC++目錄菜單中,平臺(tái)選擇Win32,選擇“顯示以下內(nèi)容的目錄”為“包含文件”,導(dǎo)入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,如果沒有找到的話,則會(huì)在運(yùn)行時(shí)報(bào)錯(cuò) System。 loadLibrary("NativeCode"); TestNative tnt = new TestNative(); tnt。
sayHello(); } publicvoid sayHello2(){ System。out。
println("Say Hello From Java"); } } 運(yùn)行,顯示“Hello World!” 9。 注意頭文件jni。
h和jni_md。h可以直接導(dǎo)入到工程中也可以。
10。注意NativeCode。
dll必須放置在java命令能訪問的路徑中。 二、從C++調(diào)用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編譯項(xiàng)目 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中如何調(diào)用這個(gè)類/方法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:運(yùn)行下面的命令產(chǎn)生頭文件1javah -classpath ../../Android.jar;../bin/classes; org.apache.NativeAdd [代碼] 新產(chǎn)生的頭文件“(org_apache_CallNative.h”內(nèi)容如下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: 編寫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: 復(fù)制編譯文件到模擬器中. 同時(shí)安裝APK程序.view sourceprint?1adb push native/libNativeAdd.so /system/lib2adb install bin/CallNative.apk 你看下這是我自己做的時(shí)候一些經(jīng)驗(yàn) ,你看看是否對你有幫助。
聲明:本網(wǎng)站尊重并保護(hù)知識(shí)產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護(hù)條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請?jiān)谝粋€(gè)月內(nèi)通知我們,我們會(huì)及時(shí)刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學(xué)習(xí)鳥. 頁面生成時(shí)間:89.789秒