Android 源码中如何添加 C C++、Java 库

Android 源码中如何添加 C C++、Java 库

1.添加 C/C++ 程序库

1.1 源码方式添加

在 device/Jelly/Rice14/ 目录下创建以下的目录和文件

bash 复制代码
libmymath
├── Android.bp
├── my_math.cpp
└── my_math.h

libmymath 是一个动态库。其 Android.bp 内容如下:

json 复制代码
cc_library_shared {
    name: "libmymath",

    srcs: ["my_math.cpp"],

    export_include_dirs: ["."],

    product_specific: true,

}

my_math.h 内容如下:

c++ 复制代码
#ifndef __MY_MATH_H__
#define __MY_MATH_H__

int my_add(int a, int b);
int my_sub(int a, int b);

#endif

my_math.cpp 内容如下:

c++ 复制代码
#include "my_math.h"

int my_add(int a, int b)
{
	return a + b;
}

int my_sub(int a, int b)
{
	return a - b;
}

接着修改我们之前添加的 hello 项目:

修改 hello.cpp

c++ 复制代码
#include <cstdio>
#include "my_math.h" //添加头文件

int main()
{
    printf("Hello Android %d \n", my_add(1,2)); //添加函数调用
    return 0;
}

修改 Android.bp:

json 复制代码
cc_binary {              
    name: "hello",       
    srcs: ["hello.cpp"], 
    cflags: ["-Werror"], 
    product_specific: true,        
    shared_libs: ["libmymath"]    //添加动态库依赖
}

接下来编译系统:

bash 复制代码
source build/envsetup.sh
lunch Rice14-eng
make -j16

编译完成启动虚拟机后,就可以通过 adb shell 运行我们的 hello 程序了

bash 复制代码
emulator
adb shell hello

执行结果如下图所示:

1.2 so 包方式添加

在 device/Jelly/Rice14 目录下创建如下的文件与文件夹:

bash 复制代码
libmymathprebuild
├── Android.bp
├── include
│   └── my_math.h
└── lib
    ├── x86
    │   └── libmymath.so
    └── x86_64
        └── libmymath.so
  • 其中 libmymath.so 是上一节中的编译产物,x86/libmymath.so 拷贝自 out/target/product/Rice14/system/product/lib/libmymath.so
  • x86_64/libmymath.so 拷贝自 out/target/product/Rice14/system/product/lib64/libmymath.so
  • my_math.h 是上一节中 libmymath 模块中拷贝过来的头文件

Android.bp 的内容如下:

json 复制代码
cc_prebuilt_library_shared {
    name: "libmymathprebuild",

     arch: {
        x86: {
            srcs: ["lib/x86/libmymath.so"],
        },
        x86_64: {
            srcs: ["lib/x86_64/libmymath.so"],
        }
    },

    export_include_dirs: ["include"],

    product_specific: true,

}

为了避免冲突,我们把上一节添加的 libmymath 移出系统源码目录或者删除。

接下来,编译整个系统,开启虚拟机

bash 复制代码
source build/envsetup.sh
lunch Rice14-eng
make -j16
emulator

接下来执行 hello 程序

bash 复制代码
adb shell hello

执行结果如下图所示:

2. 添加 Java 库

2.1 源码方式添加

在 device/Jelly/Rice14/ 目录下创建以下的目录和文件:

bash 复制代码
libmymathjava
├── Android.bp
└── com
    └── yuandaima
        └── mymath
            └── MyMath.java

libmymathjava 是一个 java 库。其 Android.bp 内容如下:

json 复制代码
java_library {
    name: "libmymathjava",
    installable: false,
    product_specific: true,
    srcs: ["**/*.java"],
    sdk_version: "current"
}

如果不指定 installable: true, 则编译出来的 jar 包里面是 .class 文件。这种包是没法安装到系统上的,只能给其他 java 模块作为 static_libs 依赖。最终生成的 jar 包不会被直接存放到 Android 的文件系统中,而是打包进依赖于当前模块的其他模块中。

MyMath.java 内容如下:

cpp 复制代码
package com.yuandaima.mymath;

public class MyMath
{

    public MyMath() {

    }

	public int add(int a, int b)
	{
		return (a+b);
	}

}

接着我们把 helllojavajar 删除,将之前写好的 hellojava 模块移动到 device/Jelly/Rice14 目录下,并做以下修改:

修改 helljava/Android.bp:

json 复制代码
java_library {
    name: "hellojava",
    installable: true,
    product_specific: true,
    srcs: ["**/*.java"],
    sdk_version: "current",
    static_libs: ["libmymathjavajar"]
}

在 device/Jelly/Rice14/Rice14.mk 中添加:

bash 复制代码
PRODUCT_PACKAGES += hellojava

接下来编译系统:

bash 复制代码
source build/envsetup.sh
lunch Rice14-eng
make -j16

编译完成启动虚拟机后:

bash 复制代码
# 进入模拟器shell
adb shell
# 配置 classpath
export CLASSPATH=/product/framework/hellojava.jar
app_process /product/framework/ com.ahaoyuandaima.main.HelloJava 

执行结果如下图所示:

2.2 Jar 包方式添加

在系统源码目录下执行:

bash 复制代码
source build/envsetup.sh
lunch Rice14-eng

接下来编译获得 jar 包:

bash 复制代码
cd device/Jelly/Rice14/libmymathjava
mm
#编译完成后,会打印出编译产物路径 out/target/product/Rice14/obj/JAVA_LIBRARIES/libmymathjava_intermediates/javalib.jar

为避免冲突我们把 device/Jelly/Rice14/libmymathjava 移动到源码以外的目录或者删除

在 device/Jelly/Rice14/ 下重新创建如下的目录结构:

bash 复制代码
libmymathjavajar
├── Android.bp
└── libmymathjava.jar

其中 libmymathjava.jar 是拷贝自编译产物 out/target/product/Rice14/obj/JAVA_LIBRARIES/libmymathjava_intermediates/javalib.jar,并改名为 libmymathjava.jar

Android.bp 的内容如下:

json 复制代码
java_import {
    name: "libmymathjavajar",
    installable: false,
    jars: ["libmymathjava.jar"],
    product_specific: true,   
}

接着修改 hellojava 模块的依赖:

json 复制代码
java_library {
    name: "hellojava",
    installable: true,
    product_specific: true,
    srcs: ["**/*.java"],
    sdk_version: "current",
    static_libs: ["libmymathjavajar"]  //修改这里
}

编译系统,并启动模拟器:

bash 复制代码
source build/envsetup.sh
lunch Rice14-eng
make -j16
emulator

验证 libmymathjavajar 模块是否被正确编译到 hellojava 模块中。

bash 复制代码
# 进入模拟器shell
adb shell
# 配置 classpath
export CLASSPATH=/product/framework/hellojava.jar
app_process /product/framework/ com.ahaoyuandaima.main.HelloJava 

执行结果如下:

相关推荐
ShineWinsu1 小时前
对于Qt:QTreeWidget常见属性以及QTreeWidgetItem类的解析
开发语言·c++·qt·gui·客户端·多叉树·qtreewidget
落羽的落羽1 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
HQL_seven3 小时前
【Android】BroadcastReceiver 详解
android
_祝你今天愉快4 小时前
Paint Cavans高级绘制:[二] Paint-滤镜,XFERMODE
android
小乖写代码5 小时前
字段获取代码(Android) · Android Input Examples
android·whatsapp·账号注册
booboosui5 小时前
停一个活只有杀进程:界面上少了「说点要求」
android
汉克老师7 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
传奇开心果编程7 小时前
【Flutter踩坑排雷】第28课:平台目录缺失与修复坑|`flutter create` 的“重建”与“覆盖”边界
android·flutter·ios·移动开发·跨平台·dart·声明式ui
晴天的雨.9928 小时前
【C++】继承篇
java·开发语言·c++
青少儿编程课堂8 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛