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 

执行结果如下:

相关推荐
雨白18 分钟前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk19 分钟前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING1 小时前
RN容器启动优化实践
android·react native
恋猫de小郭3 小时前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
樱木Plus6 小时前
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)
c++
Kapaseker9 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴9 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭19 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab20 小时前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe1 天前
Now in Android 架构模式全面分析
android·android jetpack