2012-07-17 08:06:39| 分类: 深入研究 |字号 订阅
% echo 'class Foo {' \> 'public static void main(String[] args) {' \> 'System.out.println("Hello, world"); }}' > Foo . java% javac Foo . java% dx -- dex -- output = foo . jar Foo . class% adb push foo . jar / sdcard% adb shell dalvikvm - cp / sdcard / foo . jar FooHello , world
============================================TARGET_PRODUCT = simTARGET_BUILD_VARIANT = engTARGET_SIMULATOR = trueTARGET_BUILD_TYPE = debugTARGET_ARCH = x86HOST_ARCH = x86HOST_OS = linuxHOST_BUILD_TYPE = releaseBUILD_ID =============================================
% dalvikvmE / dalvikvm ( 19521 ): ERROR : must specify non - '.' bootclasspathW / dalvikvm ( 19521 ): JNI_CreateJavaVM failedDalvik VM init failed ( check log file )
#!/bin/sh# base directory, at top of source tree; replace with absolute pathbase=`pwd`# configure root dir of interesting stuffroot=$base/out/debug/host/linux-x86/product/sim/systemexport ANDROID_ROOT=$root# configure bootclasspathbootpath=$root/frameworkexport BOOTCLASSPATH=$bootpath/core.jar:$bootpath/ext.jar:$bootpath/framework.jar:$bootpath/android.policy.jar:$bootpath/services.jar# this is where we create the dalvik-cache directory; make sure it existsexport ANDROID_DATA=/tmp/dalvik_$USERmkdir -p $ANDROID_DATA/dalvik-cacheexec dalvikvm $@
% cat > Foo . javaclass Foo { public static void main ( String [] args ) {System . out . println ( "Hello, world" );} }( ctrl - D )% javac Foo . java% dx -- dex -- output = foo . jar Foo . class% ./ rund - cp foo . jar FooHello , world
% ./rund -help
上述所有都是基于x86的,其他的架构还要考虑porting工作,如果libffi支持你的系统,工作量会比较小。
http://hubingforever.blog.163.com/blog/static/171040579201261665254201/
2012-07-16 06:59:42| 分类: 深入研究 |字号 订阅
# Script to start "am" on the device, which has a very rudimentary# shell.#base=/systemexport CLASSPATH=$base/framework/am.jarexec app_process $base/bin com.android.commands.am.Am "$@"
http://hubingforever.blog.163.com/blog/static/17104057920126166411775/
2012-07-16 06:47:35| 分类: 深入研究 |字号 订阅
# Script to start "am" on the device, which has a very rudimentary# shell.#base=/systemexport CLASSPATH=$base/framework/am.jarexec app_process $base/bin com.android.commands.am.Am "$@"
# Script to start "pm" on the device, which has a very rudimentary# shell.#base=/systemexport CLASSPATH=$base/framework/pm.jarexec app_process $base/bin com.android.commands.pm.Pm "$@"
http://zhangcb666.blog.163.com/blog/static/46963529201242302824661/
2012-05-23 12:28:24| 分类: Android |字号 订阅
Android源码编译jar到system/framework并在应用中调用
1. 在Java工程下添加Android.mk文件,内容如:
##build to jar
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under,src)
LOCAL_MODULE := com.test.manager
LOCAL_CERTIFICATE := platform
include $(BUILD_JAVA_LIBRARY)
##cp com.test.manager to system/etc/permission 这里是把com.test.manager.xml拷贝到/system/etc/permission文件中
include $(CLEAR_VARS)
LOCAL_MODULE := com.test.manager.xml
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS :=ETC
#this will install the file in /system/etc/premission
LOCAL_MODULE_PATH :=$(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES :=$(LOCAL_MODULE)
include $(BUILD_PREBUILT)
2. 在工程根目录下添加com.test.manager.xml文件
<?xml version="1.0" encoding="utf-8"?>
<permissions>
<library name="com.test.manager"
file="/system/framwork/com.test.manager.jar"/>
</permissions>
3. 调用
1> 在调用Jar的工程中添加
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under,src)
LOCAL_JAVA_LIBRARIES := com.test.manager #引入jar包
LOCAL_PACKAGE_NAME := Test
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
2>在工程的AndroidManifest.xml文件的<application>中加入
<uses-library android:name="com.test.manager"/>
http://disanji.net/2011/01/22/android-jar/
主要为了解决如下问题:
项目中使用了Android未公开的API,在Eclipse下会有红叉显示。
不同的项目抽出相同部分的代码共用。
必需的前提条件:
需要有Android源代码,编译的库文件主要是封装未公开API或者共用代码。
工程1:Java库文件工程
该工程最终会生成以jar结尾的Java库文件,并会被安装到设备的以下目录:
/system/framework/
另外还会安装相关库文件的说明文件,使系统能够找到库文件:
/system/etc/permissions/
1、建立工程
在Eclipse下新建一个空的Java工程。
在工程的
Java Build Path -> Libraries
下,导入Android的SDK中的 android.jar 库。
为工程创建相应的包和java文件。
下面假设包路径为 com.mytest.lib,最终生成的库为 mylib.jar。
2、为工程添加注册文件
在库文件工程的根目录下创建以下文件:
<permission xml file name>.xml
该文件是用来向系统注册库用的,名称可以自己定,在下面假设该文件为 mylibxml.xml。
在文件中加入以下内容:
1 2 3 4 5 6 7 |
<?xml version="1.0" encoding="UTF-8"?> <permissions> <library name="com.mytest.lib" file="/system/framework/mylib.jar" /> </permissions> |
其中的 library 用于将其下的 name 和 file 两个属性关联起来,name 的值后边会用到。
这里的 name 指定为工程的包名。
这里的 file 指定为库文件的存放路径,应该是:
/system/framework/<jar file name>.jar
3、为工程添加makefile文件:
在库文件工程的根目录下创建以下文件:
Android.mk
该文件是用来编译工程的,名称固定。
在文件中加入以下内容:
LOCAL_PATH:= $(call my-dir)
#MAKE_JAR
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE := mylib
include $(BUILD_JAVA_LIBRARY)
#MAKE_XML
include $(CLEAR_VARS)
LOCAL_MODULE := mylibxml.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)
其中,MAKE_JAR 部分的 LOCAL_MODULE 部分指定为想要生成的库文件的名字,
需要与 .xml 文件中的 library 下的 file 部分一致。
其中,MAKE_XML 部分的 LOCAL_MODULE 部分指定为用于注册库的 .xml 文件。
4、生成应用程序可用的库文件
此时的工程,如果使用了未公开的API的话,在eclipse下应该是有红叉的。
这些错误不用管,只需要保证程序在Android的源码下能够编译通过即可。
将工程的java文件以及 .xml 和 .mk 按照目录结构拷贝到以下目录:
<Android source folder>/packages/apps/<project name>/
运行以下命令:
$ cd <Android source folder>
$ . ./build/envsetup.sh
$ mmm packages/apps/<project name>
将会生成一个 .jar 文件和一个 .xml 文件。
以上两个文件是应用程序在运行时需要用到的。
调试应用前,需要将两个文件拷贝到设备的相应目录上去:
.jar 文件:/system/framework/
.xml 文件:/system/etc/permissions/
拷贝到设备使用以下命令:
$ sudo adb push <.jar or .xml file path> <path in device>
拷贝完以后需要重启设备。
5、生成在Eclipse可以引用的库文件
在源码下编译的 .jar 文件在Eclipse中是不能使用的,需要单独生成。
在Eclipse下选中工程根目录,选择文件菜单中的导出Export,然后选择jar类型。
导出为jar文件时,只需要选中相应的java文件即可。
这样生成的jar文件仅仅供应用程序在Eclipse下使用,除非是以下情况:
库文件没有使用非公开的API,并且,
应用本身在Eclipse下编译就能够使用,不需要到源码下编译。
暂且为该文件命名为mylibtemp.jar
工程2:Android应用工程
1、建立工程
新建一个Android工程。
在工程的
Java Build Path -> Libraries
下,导入 mylibtemp.jar 库。
使用 mylibtemp.jar 中的类编写代码。
下面假设最后生成的应用程序文件为 myapp.apk。
2、编辑AndroidManifest.xml文件
编辑工程根目录下的 AndroidManifest.xml 文件。
在 application 下添加以下内容:
1 2 3 |
<uses-library android:name="com.mytest.lib"> </uses-library> |
其中的 :name 表示所引用的库文件的包名。
其与库工程的 .xml 文件中的 name 应该是一致的。
这样在应用运行时就能够找到相应的 .jar 文件了。
如果引用了多个库,需要添加多个 uses-library 标签。
3、为工程添加makefile文件:
在库文件工程的根目录下创建以下文件:
Android.mk
该文件是用来编译工程的,名称固定。
在文件中加入以下内容:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_LIBRARIES := mylib
LOCAL_PACKAGE_NAME := myapp
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
其中的 LOCAL_JAVA_LIBRARIES 表示程序会用到的库文件。
其名成与库工程下的 .mk 文件中 MAKE_JAR 部分下的 LOCAL_MODULE 应该是一致的。
其中的 LOCAL_PACKAGE_NAME 表示应用最后生成的名称。
4、编译应用程序
将工程的 src、res、assets 文件夹以及文件:
Android.mk 和 AndroidManifest.xml
按照目录结构拷贝到以下目录:
<Android source folder>/packages/apps/<project name>/
引用的 .jar 库文件并不需要。
运行以下命令:
$ cd <Android source folder>
$ . ./build/envsetup.sh
$ mmm packages/apps/<project name>
将会生成一个 .apk 文件。
运行以下命令将应用安装到设备:
$ sudo adb install [-r] <apk file path>
原文作者:不详,如果看见请联系我们~
原文链接:http://blog.csdn.net/ameyume/archive/2010/12/05/6055948.aspx