Android Studio手动配置Makefile、CMake

Android Studio手动配置Makefile、CMake,第1张

在Ubutu上编译出来的.so文件,怎么添加到Android项目中去使用呢?目前:可以通过

Makefile方式和CMake方式引入预编译静动态库(静态库.a 动态库.so)到项目中去使用。就目前而言CMake是Goole推荐使用方式,但是加入接手一个老的NDK项目是MakeFile方式,看不懂就GePi了,所以这里我们还是介绍一下MakeFile方式将静动态库加入到AS中,完成NDK项目的开发。废话不多说,直接撸步骤了:

1、在src/main目录下创建一个ndkBuild文件夹

2、在此文件中创建一个Android.mk文件

3、在此文件中创建一个test.c的源文件

4、将编译好的的.so库复制到src/main目录下

如图所示目录结构:

1、编辑Android.mk文件

2、编辑grade(app)文件

3、编辑test.c文件

4、使用编译好的.so库里面的函数

本结果运行在Android 5.1 系统上

再次运行在Android8.0系统上

看以清楚知道,其实我们的APK包里面就没有libMainTest.so库,所以APP在8.0上会出现奔溃的现象。so...

1、在src/main目录下创建一个cmake文件夹

include:里面包含需要一些头文件

cmakeTest.c:需要编译的源文件

2、在app目录下创建一个文件:CmakeLists.txt

3、编辑grade(app)

4、编辑cmakeTest.c文件

4、引用编译好的libcmakeTest.so

Android 8.0.0系统:

Android 5.1.1系统:

1.准备工作: (ubuntu1110 32位)

ubuntu等linuxOS,下载好eclipse,安装好JDK, 安装好android的SDK, 在eclipse中成功打开android 手机模拟器即OK。

2.初始化编译环境 :

关注该网页上的“installing required packages”,其中有的软件包因为版本问题而安装不上,不用管它,之后遇到错误再单独解决。

3.下载内核源码:

android 2.3 内核 下载需要等待一段时间。

4.下载交叉编译器:

该步骤有可能耗费大量时间,依据网速不同,几个小时到几天不等,或许可以尝试git clone 后面的地址只下载prebuilt/linux-x86/toolchain

5.设置参数以及编译:

$ export ARCH=arm

$ export SUBARCH=arm

$ export CROSS_COMPILE=arm-eabi-

$ cd goldfish // 进入下载的源代码目录

$ git checkout <commit_from_first_step> //这个步骤我没有做,不知道干嘛用的

$ make goldfish_defconfig

$ make

6.报错信息:

若有报错说找不到 (arm-eabi-gcc command not found)等等

7.测试:

最后,测试一下刚才编译的内核:emulator -avd myavd -kernel ~/goldfish/arch/arm/boot/zImageemulator若系统找不到,可以去android SDK中某文件夹找到,加入系统PATH即可。 -avd后面的参数 myavd即为模拟器的名字,这个我是在eclipse中的模拟器管理中新建的一个模拟器,用那个模拟器的名字即可。 -kernel后面的参数就找到刚才编译出的内核的路径。

若启动模拟器失败,可尝试关闭后再启动。第一次启动模拟器时可能需要等待比较长的时间,3分钟到15分钟不等。

1,同目录下的makefile,如

#

# Makefile for industrial I/O Magnetometer sensors

#

obj-$(CONFIG_SENSORS_AK8975)+= ak8975.o

obj-$(CONFIG_SENSORS_HMC5843)+= hmc5843.o

2,同目录下的kconfig

#

# Magnetometer sensors

#

comment "Magnetometer sensors"

config SENSORS_AK8975

tristate "Asahi Kasei AK8975 3-Axis Magnetometer"

depends on I2C

help

Say yes here to build support for Asahi Kasei AK8975 3-Axis

Magnetometer.

To compile this driver as a module, choose M here: the module

will be called ak8975.

3,总的config(配置变量为Y)

各项目配置文件的位置不同,

coffee:kernel/arch/arm/configs/M7023Q-debug-perf_defconfig

juice:common/customer/configs

配置信息如下:

# CONFIG_CFG80211 is not set

CONFIG_EXPERIMENTAL=y

CONFIG_LOCALVERSION="$(KERNEL_LOCAL_VERSION)-perf"

CONFIG_SWAP=y

CONFIG_ZRAM=m

CONFIG_SYSVIPC=y

CONFIG_SENSORS_AK8975=y

......

查看变量是否在编译时配置成功:

out/target/product/m7023q/obj/KERNEL_OBJ/include/generated/Autoconf.h

查找CONFIG_SENSORS_AK8975

若在编译时有配置成功,将找到这一行:

#define CONFIG_SENSORS_AK8975 1

4、修改板级文件:

4.0及后续项目统一在:kernel/arch/arm/mach-msm/board-qrd7627a.c

注意juice中,很多配置(如tp)写在kernel/arch/arm/mach-msm/board-msm7627a-io.c

在代码中增加新模块的内容,应该有两处,第一处设置函数和结构体,第二处实际调用,注意引用上述第3步新增的编译开关将代码限制起来。

这些内容大多可以拷贝其它模块,但是名字要和driver中的相同,注意要改的地方除了名字之外,还有中断脚和I2C脚。其中固定模块的中断脚大部分时候不会改变(如tp就是int:48,reset:26),除非板子的datasheet特别注明才需要改变。但是I2C脚是会随着slaver device的改变而改变的,需要查清楚。

配置platform_data:

一般需要初始化一个xxx_platform_data结构体(这个结构体的声明应该让驱动文件可视,probe中才知道去读某个platformdata.yyy),并在i2c_board_info结构体中用.platform_data指向它,然后这个i2c_board_info将在板级文件中被注册(作为函数i2c_register_board_info()的参数)。而这个.platform_data很有可能在驱动的probe函数中调用到,例如:

static struct msg2133_ts_platform_data msg2133_platformdata= {

.irq = 0,

.reset = GPIO_TP_RESET,

}

static struct i2c_board_info i2c_info_msg2133_dpt = {

I2C_BOARD_INFO("msg2133", 0x27),

.platform_data = &msg2133_platformdata,

}

i2c_info_msg2133_dpt.platform_data->irq = gpio_to_irq(GPIO_TP_INT)//结构体初始化的时候只能以常量赋值,因为此处需要做GPIO到irq的映射,所以要在此处赋值。

i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, &i2c_info_msg2133_dpt, 1)

在驱动的probe中:pdata =client->dev.platform_data

...... = pdata.yyy......//(msg2133_ts_platform_data在该文件中可见)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11382470.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存