欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

Android平臺Java代碼的條件編譯問題 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們在追求其視覺表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏壧峁┍憬莸闹С郑?

您當(dāng)前位置>首頁 » 新聞資訊 » 技術(shù)分享 >

Android平臺Java代碼的條件編譯問題

發(fā)表時(shí)間:2020-10-19

發(fā)布人:葵宇科技

瀏覽次數(shù):101

 在代碼的開辟過程中,不管是C/C++也好,Java也罷,都要面對在平臺移植的問題, 所以弗成避免的要推敲前提編譯的問題。 在C/C++代碼的開辟中,前提編譯的實(shí)現(xiàn)很輕易實(shí)現(xiàn),可以分成二種:一種是在單個(gè)代碼文件中經(jīng)由過程 #ifdef ... #endif 或者 #if ... #endif 的方法選擇性編譯文件中的代碼,另一種是在Makefile中經(jīng)由過程宏斷定來選擇性編譯某個(gè)文件。在Java代碼的開辟中,實(shí)現(xiàn)前提編譯則沒有直接對應(yīng)的辦法,然則仍然可以采取變通的辦法來實(shí)現(xiàn)前提編譯。
 
對于單個(gè)文件內(nèi)的的代碼的前提編譯,可以應(yīng)用Java代碼的優(yōu)化功能來實(shí)現(xiàn):
  private final boolean DEBUG = false;
  if (DEBUG) {
     Log.i("TEST","hello,world");
  }

這里,因?yàn)镈EBUG是一個(gè)final變量,相當(dāng)于C/C++里的CONST變量,
所以Java編譯器在編譯的時(shí)刻會對代碼進(jìn)行優(yōu)化,當(dāng)DEBUG為false時(shí),就不會把if瑯綾擎的代碼編譯進(jìn)去。
然則這種辦法有個(gè)缺點(diǎn),就是不克不及實(shí)現(xiàn)對函數(shù)的前提編譯,這個(gè)時(shí)刻,Java的開辟人員可能就要愛慕C#的開辟人員了,因?yàn)樵贑#里可以像C/C++一樣實(shí)現(xiàn)前提編譯的功能。
 
下面重點(diǎn)來講下Android的Java代碼的開辟中若何實(shí)現(xiàn)選擇性編譯某些Java代碼文件。
 
在Android.mk中,有一行腳本大年夜家應(yīng)當(dāng)異常熟悉:
LOCAL_SRC_FILES := $(call all-java-files-under, src)

這條代碼的意思是大年夜src目次中查找所有的java文件,并保存到LOCAL_SRC_FILES 
 
所以我們可以選擇性的把平臺相干的代碼加到LOCAL_SRC_FILES中。
 
辦法如下:
建立如下的目次構(gòu)造:
│  Android.mk

└─platform
    │  Android.mk
    │
    ├─bb
    │  │  Android.mk
    │  │
    │  └─src
    └─aa
        │  Android.mk
        │
        └─src
platform/Android.mk中的內(nèi)容如下:
include $(call all-makefiles-under, $(LOCAL_PATH)/platform)

這里的LOCAL_PATH為在根目次的Android.mk中定義的LOCAL_PATH
履行時(shí)會包含platform子目次下的所有Android.mk
在platform目次下放的即為平臺相干的java代碼
 
platform/aa目次下的Android.mk內(nèi)容如下:
ifeq ($(TARGET_PRODUCT),aa) 
PLATFORM_DIR := aa 
Endif
 
platform/bb目次下的Android.mk內(nèi)容如下:
ifeq ($(TARGET_PRODUCT),bb)
 PLATFORM_DIR := bb 
endif

 
platform下的平臺相干子目次Android.mk文件會斷定平臺是否相符請求,如不雅相符請求就會把子目次賦值給PLATFORM_DIR變量。
 
來看根目次下的Android.mk的內(nèi)容如下:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) 
... 
LOCAL_SRC_FILES := $(call all-java-files-under, src) 
include $(LOCAL_PATH)/platform/Android.mk 
LOCAL_SRC_FILES += $(call all-java-files-under, platform/$(MTA_PLATFORM_DIR)/src) 
...

標(biāo)紅的第一行代碼把platform/Android.mk包含進(jìn)來,履行的腳本會根據(jù)平臺定義PLATFORM_DIR變量。第二行代碼即為把平臺相干的src目次下的所有java代碼包含進(jìn)來.
 
如許,就實(shí)現(xiàn)了編譯不合文件的java代碼了。
 
實(shí)現(xiàn)前提編譯還有一種辦法,就是把平臺相干的代碼編譯成static Java庫,
辦法是用
include $(BUILD_STATIC_JAVA_LIBRARY)代替include $(BUILD_JAVA_LIBRARY)
include $(BUILD_JAVA_LIBRARY)會直接編譯出jar包。而include $(BUILD_STATIC_JAVA_LIBRARY)固然也會生成jar包,
然則在被其它apk的編譯時(shí),如不雅經(jīng)由過程LOCAL_STATIC_JAVA_LIBRARIES把這個(gè)庫包含進(jìn)來,如許也會把代碼靜態(tài)編譯進(jìn)apk,而不會依附于額外的jar包。
然則這種辦法明顯更復(fù)雜,有興趣可以試下。
 

相關(guān)案例查看更多