Android平台Java代码的条件编译问题

在代码的开发过程中,不管是C/C++也好,Java也罢,都要面对在平台移植的问题, 所以不可避免的要考虑条件编译的问题。 在C/C++代码的开发中,条件编译的实现很容易实现,可以分成二种:一种是在单个代码文件中通过 #ifdef ... #endif 或者 #if ... #endif 的方式选择性编译文件中的代码,另一种是在Makefile中通过宏判断来选择性编译某个文件。在Java代码的开发中,实现条件编译则没有直接对应的方法,但是仍然可以采用变通的方法来实现条件编译。

对于单个文件内的的代码的条件编译,可以利用Java代码的优化功能来实现:

  private final boolean DEBUG = false;
  if (DEBUG) {
     Log.i("TEST","hello,world");
  }

这里,因为DEBUG是一个final变量,相当于C/C++里的CONST变量,

所以Java编译器在编译的时候会对代码进行优化,当DEBUG为false时,就不会把if里面的代码编译进去。

但是这种方法有个缺陷,就是不能实现对函数的条件编译,这个时候,Java的开发人员可能就要羡慕C#的开发人员了,因为在C#里可以像C/C++一样实现条件编译的功能。

下面重点来讲下Android的Java代码的开发中如何实现选择性编译某些Java代码文件。

在Android.mk中,有一行脚本大家应该非常熟悉:

LOCAL_SRC_FILES := $(call all-java-files-under, src)

这条代码的意思是从src目录中查找所有的java文件,并保存到LOCAL_SRC_FILES

所以我们可以选择性的把平台相关的代码加到LOCAL_SRC_FILES中。

方法如下:

建立如下的目录结构:

│  Android.mk

└─platform

│  Android.mk

├─bb

│  │  Android.mk

│  │

│  └─src

└─aa

│  Android.mk

└─src

platform/Android.mk中的内容如下:

include $(call all-makefiles-under, $(LOCAL_PATH)/platform)

这里的LOCAL_PATH为在根目录的Android.mk中定义的LOCAL_PATH

执行时会包含platform子目录下的所有Android.mk

在platform目录下放的即为平台相关的java代码

platform/aa目录下的Android.mk内容如下:

ifeq ($(TARGET_PRODUCT),aa)
PLATFORM_DIR := aa
Endif

platform/bb目录下的Android.mk内容如下:

ifeq ($(TARGET_PRODUCT),bb)
 PLATFORM_DIR := bb
endif

platform下的平台相关子目录Android.mk文件会判断平台是否符合要求,如果符合要求就会把子目录赋值给PLATFORM_DIR变量。

来看根目录下的Android.mk的内容如下:

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)
...

标红的第一行代码把platform/Android.mk包含进来,执行的脚本会根据平台定义PLATFORM_DIR变量。第二行代码即为把平台相关的src目录下的所有java代码包含进来.

这样,就实现了编译不同文件的java代码了。

实现条件编译还有一种方法,就是把平台相关的代码编译成static Java库,

方法是用

include $(BUILD_STATIC_JAVA_LIBRARY)代替include $(BUILD_JAVA_LIBRARY)

include $(BUILD_JAVA_LIBRARY)会直接编译出jar包。而include $(BUILD_STATIC_JAVA_LIBRARY)虽然也会生成jar包,

但是在被其它apk的编译时,如果通过LOCAL_STATIC_JAVA_LIBRARIES把这个库包含进来,这样也会把代码静态编译进apk,而不会依赖于额外的jar包。

但是这种方法明显更复杂,有兴趣可以试下。

时间: 2024-10-06 01:20:06

Android平台Java代码的条件编译问题的相关文章

Unity调用android平台java代码

最近因为公司需要开始研究Unity平台的sdk接入.首先从调用最简单的java代码开始. 1.首先建立android lib项目. package unityPlugin; import com.unity3d.player.UnityPlayer; import android.widget.Toast; public class UnityPluginTest { public static void show(){ UnityPlayer.currentActivity.runOnUiTh

针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码。

Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程的基础上继续添加新的视图,最后由开发者自行打包生成IPA包,发布程序.而Unity for Android打包直接生成APK包,等于说源代码开发者是看不到的,但是Unity的自身确实有些局限,针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码.本章我们的目标是使用Unity的脚本打开Activity.首先我们创建一个普通的Android

Android视频通话Java代码

  近期学习Android平台下跨平台音视频通信开发,尽管网上有非常多开源项目供我们參考学习.但音视频效果非常一般,还有非常多不稳定的因素,毕竟是开源嘛.在国内我找到了一个比較好音视频通信解决方式(百度下载官方Anychat for Android 的demo),该案例提供了纯Java语言接口供我们调用,随后我參照官方android demo程序和开发文档并结合自己的见解写了一个android音频通信软件.200行以内代码就搞定了(难以相信吧). 事实上我仅仅是调用其相关API就可以实现.下面是

android 用java代码设置布局、视图View的宽度/高度或自适应

在achat项目中,对话内容的长宽设置为自适应,但是如果文本内容太多,则宽度差不多布满,若自己说的和对方说的都很多内容,则满屏都是文字,则不容易分辨出是来自别人说的还是自己说的.那么需要对本身具有自适应的布局再来个宽度限制. 首先,在xml里面定义layout的layout_width/layout_height都要设置为wrap_content,然后在getView方法里面,一开始就让这个布局wrap_content(为什么xml里面设置了wrap_content,这里还要再设置一遍呢?因为布

【Android】Android Studio 1.5+ 中混合调试Native和Java代码

[Android]Android Studio 1.5+ 中调试Native和Java代码 Android Studio 1.5+表示Android Studio 1.5版本以及以上. 网上大部分中文或英语教程还是停留在老版本的Android Studio的Debug的设置,要么不全.正好最近工作中要在Android Studio中调试C++代码,就来写一篇咯. Android Studio 1.5+的调试设置与之前有所不同. 而且新版中推出了一个Hybrid的调试:可以混合调试Native代码

Unity3D研究院之打开Activity与调用JAVA代码传递参数

原地址:http://www.xuanyusong.com/archives/667    Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程的基础上继续添加新的视图,最后由开发者自行打包生成IPA包,发布程序.而Unity for Android打包直接生成APK包,等于说源代码开发者是看不到的,但是Unity的自身确实有些局限,针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码.本

Android(java)学习笔记257:JNI之NDK开发步骤(helloword案例)

1.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们要通过NDK工具把在Win7系统下编写的C代码,转化为可以在Linux(Linux2.6.6---Android内核)运行的二进制代码,最后通过JNI协议规范,Android中java代码就可以调用这个转化后的二进制代码运行. (1)在Eclipse中新建一个Android工程,命名为"HelloWorld",如

Android平台中常用的可视化控件

一. TextView 二. ImageView 1.结构 java.lang.Object android.view.View android.widget.ImageView 已知直接子类: ImageButton, QuickContactBadge 已知间接子类: ZoomButton 2.类概述 显示任意图像,例如图标.ImageView类可以加载各种来源的图片(如资源或图片库),需要计算图像的尺寸,比便它可以在其他布局中使用,并提供例如缩放和着色(渲染)各种显示选项. 3.XML属性

Android WebView Java和JavaScript交互

Java调用JavaScript mWebView.loadUrl("javascript:toast()"); js: <script language="javascript> <!--提供给android的java代码调用--> function toast(){ alert("fdsaf") } JavaScript调用Java WebView提供了一个名为WebSetting的工具类来实现让WebView中的JavaScr