abi bootable dalvik device frameworks libnativehelper ndk pdk system
art build developers docs hardware Makefile out prebuilts
bionic cts development external libcore modules packages sdk
source build/envsetup.sh
配置环境变量加载分支
lunch
选择分支
You're building on Linux
Lunch menu... pick a combo:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_mips-eng
4. aosp_mips64-eng
5. aosp_x86-eng
6. aosp_x86_64-eng
7. fspad_733-eng
8. fspad_733-user
Which would you like? [aosp_arm-eng] 7
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=5.0 android 版本号
TARGET_PRODUCT=fspad_733 厂家产品
TARGET_BUILD_VARIANT=eng android 发行类别
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm 平台
TARGET_ARCH_VARIANT=armv7-a-neon 平台架构
TARGET_CPU_VARIANT=cortex-a7 硬件编号
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64 宿主机
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.16.0-30-generic-x86_64-with-Ubuntu-14.04-trusty 宿主机内核版本
HOST_BUILD_TYPE=release
BUILD_ID=LRX21V
OUT_DIR=out 指定的输出目录
make
编译android源码
1 LOCAL_PATH := $(call my-dir) 获得androidmk路径
2 include $(CLEAR_VARS) 清空除了 local_path 之外的环境变量
3 LOCAL_MODULE := test 要生成的目标
4 LOCAL_SRC_FILES := test.c 目标依赖的源文件
5 LOCAL_MODULE_TAGS := eng 发行类型
6 include $(BUILD_EXECUTABLE) 生成的目标文件的类型
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译
windows | linux | |
---|---|---|
cd | cd | 切换路径 |
dir | ls | 查看当前路径 |
del | rm | 删除 |
cp | cp | 拷贝 |
d: | 进入D盘 |
1.解压 fastboot 到D盘根目录下
2.通过 dos终端 进入fastboot 目录下
3.在fastboot 目录下 执行 adb devices 列出已连接的所有设备串号
4.adb shell 进入android 后台终端
5.exit 退出终端
adb push test /data
从window 上传到 android
adb pull /data/test
从android 下载到 windows
int __android_log_print(int prio, const char *tag, const char *fmt, ...)
typedef enum android_LogPriority {
80 ANDROID_LOG_UNKNOWN = 0,
81 ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */
82 ANDROID_LOG_VERBOSE,
83 ANDROID_LOG_DEBUG,
84 ANDROID_LOG_INFO,
85 ANDROID_LOG_WARN,
86 ANDROID_LOG_ERROR,
87 ANDROID_LOG_FATAL,
88 ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */
89 } android_LogPriority;
//要包含 #include
__android_log_print(ANDROID_LOG_INFO, "aaaaaaa" , "******fd = %d",fd);
//mk文件必须要加liblog系统库
1 LOCAL_PATH := $(call my-dir)
2 include $(CLEAR_VARS)
3 LOCAL_MODULE:= libnative
4 LOCAL_SRC_FILES:= src/native.c
5 LOCAL_MODULE_TAGS:= eng
6 LOCAL_SHARED_LIBRARIES:= liblog 当使用android 系统库是使用 LOCAL_SHARED_LIBRARIES 来指定使用库的名称
7 LOCAL_MODULE_PATH:= $(LOCAL_PATH)/lib
8 include $(BUILD_SHARED_LIBRARY)
```
***
# 实现安卓应用控制LED
1. 写jni 将iboled.c 生成 libiboled.so 上传到 android 平板的 /system/lib 目录下
* 如果出现 /system/lib 只读则执行:```mount -o rw,remount -t ext4 /dev/block/by-name/system```
2. 写一个安卓应用 , 调用jni方法。
### iboled.c
int fd;
jint Jopen(JNIEnv *env,jobject obj,jstring dev){
const jbyte *str;
str = (*env)->GetStringUTFChars(env, dev, NULL);
if (str == NULL) return -1;
fd = open(str,O_RDWR);
if (fd < 0) {
__android_log_print(ANDROID_LOG_INFO, "openFailed", "openFailed %d \n",fd);
return -1;
}else{
__android_log_print(ANDROID_LOG_INFO, "openSeccus", "openSeccus %d \n",fd);
}
return fd;
}
void Jioctl(JNIEnv *env,jobject obj,jint cmd){
if (cmd == 1) ioctl(fd,LED_ON);
else ioctl(fd,LED_OFF);
__android_log_print(ANDROID_LOG_INFO, “ioctl”, “cmd = %d \n”,cmd);
return;
}
void Jclose(JNIEnv *env,jobject obj){
close(fd);
return;
}
JNINativeMethod methods[]={
“open”,”(Ljava/lang/String;)I”,(void *)Jopen,
“close”,”()V”,(void *)Jclose,
“ioctl”,”(I)V”,(void *)Jioctl,
};
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved){
JNIEnv *env;
jclass cls;
(*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_2);
if(env == NULL) return JNI_ERR;
cls = (*env)->FindClass(env, "com/ibo/jnidemo/TestJni");
if(cls == NULL) return JNI_ERR;
(*env)->RegisterNatives(env, cls,methods, sizeof(methods)/sizeof(JNINativeMethod));
return JNI_VERSION_1_2;
}
### Android.mk
LOCAL_PATH := (callmy−dir)include (CLEAR_VARS)
LOCAL_MODULE :=libiboled
LOCAL_SRC_FILES :=src/iboled.c
LOCAL_MODULE_TAGS :=eng
LOCAL_SHARED_LIBRARIES :=liblog
LOCAL_MODULE_PATH := (LOCALPATH)/libinclude (BUILD_SHARED_LIBRARY)
# 1.写完 Android.mk 之后 执行 mm 生成 libiboled.so
# 2. libiboled.so 复制到 fastboot 根目录
# 3.执行 ```adb push libiboled.so system/lib``` 上传到 android 平板的 /system/lib 目录下
### TestJni.java
package com.ibo.jnidemo;
class TestJni{
static{
System.loadLibrary(“iboled”);
}
public native int open(String dev);
public native void close();
public native void ioctl(int cmd);
}
### MainActivity.java
package com.ibo.jnidemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn;
boolean isLight = false;
private TestJni ibo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ibo = new TestJni();
int open = ibo.open("/dev/led");
if (open<0){
System.out.println("#### open error ! "+open);
return;
}
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(this);
}
@Override
protected void onDestroy() {
ibo.ioctl(0);
ibo.close();
super.onDestroy();
}
@Override
public void onClick(View v) {
if (isLight){
isLight=false;
ibo.ioctl(0);
btn.setText("on");
}else{
isLight=true;
ibo.ioctl(1);
btn.setText("off");
}
}
}
“`