为了给Android编译程序,你需要ARM工具链(toolchain). 我发现差察有两种主张,分别是使用Android Prebuild toolchain和CodeSourcery
1)Android Prebuild toolchain
Android没有使用传统的libc库.相反,它用了Bionic库,一个由Google开发的,用在Android移动软件平台上的轻量级的libc
Bionic被裁剪到只支持 Android系统.请看 六百万美元的c程序库
2)CodeSourcery
CodeSourcery是ARM的合作伙伴. 专门虚缺茄为ARM处理器开发增强GUN工具链的,并提供验证过的GNU工具链.这些工具链有很多不同的版本.
对于Android平台,需要 arm-none-linux-gnueabi, 而 arm-none-eabi是没有glibc包含在里面的,主要面向那些编译完整的native库和应用(比如FreeRTOS)
译者注扮链: arm-none-eabi就是用来编译裸机程序的,请参考 最简单的ARM裸机程序
我个人的观点,如果白手起家开始创建一个Android的应用程序,你应该选择Bionic.
但是如果你选择从你的PC环境移植一个库到Android,你应该选择CodeSourcery
如果你使用到线程或者C++异常,Bionic库也不能完全支持它们(实际上,它根本就不支持异常)
agcc.pl是Andrew Ross开发的一个脚本,让你以一种很简单的方法来自动包含常用的库,使用Android的ARM工具链gcc
某种程度上,他像makefile
第1种方法使用Makefile和Android NDK
AR = arm-linux-androideabi-ar
AS = arm-linux-androideabi-as
CC = arm-linux-androideabi-gcc
CXX = arm-linux-androideabi-g++
LD = arm-linux-androideabi-ld.gold
NDK_KIT = /home/tim/android-ndk-r10b
PLATF_KIT = platforms/android-9
ARM_INC = $(NDK_KIT)/$(PLATF_KIT)/arch-arm/usr/include
ARM_LIB = $(NDK_KIT)/$(PLATF_KIT)/arch-arm/usr/lib
OBJS = hello.o
EXES = hello
hello : hello.o
$(LD) --dynamic-linker=/system/bin/linker -nostdlib \
-rpath-link=$(ARM_LIB) \
$(ARM_LIB)/crtbegin_dynamic.o \
-L$(ARM_LIB) -lc \
-o hello hello.o
hello.o: hello.c
$(CC) -I $(ARM_INC) -c hello.c
clean:
rm -f $(OBJS) $(EXES)
源代码
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("Hello Android\n")
return 0
}
设置环境变量 envsetup.sh
export PATH=$PATH:/home/tim/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin
最后,运行 make 就可以了
关于 -rpath-link选项,请参考 gcc链接选项
第二种简单方法,使用shell脚本#!/bin/sh
OS='linux'
ANDROIDSDK='android-14'
PROGDIR='/home/tim/android-ndk-r10b/'
PROGDIR=`cd $PROGDIR && pwd`
ARMEABIGCC=$PROGDIR/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
ARMEABILIB=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/lib
ARMEABIINC=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/include
ARMEABICRT="$ARMEABILIB/crtbegin_dynamic.o $ARMEABILIB/crtend_android.o"
LINKER=/system/bin/linker
echo "GCC:"$ARMEABIGCC "LIB:"$ARMEABILIB "LINKER":$LINKER "PARAMS:"$@
echo "CRT:"$ARMEABICRT
$ARMEABIGCC $@ -Wl,-rpath-link=$ARMEABILIB,-dynamic-linker=$LINKER -L$ARMEABILIB $ARMEABICRT -I$ARMEABIINC -nostdlib -lc
保存为b
/b hello.c -o hello
就可以了
实际就是运行命令
/home/tim/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc \
-Wl,-rpath-link=/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib,-dynamic-linker=/system/bin/linker \
-L/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib \
/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib/crtbegin_dynamic.o /home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib/crtend_android.o \
-I/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/include -nostdlib -lc \
hello.c -o hello
crtbegin_dynamic.o 和 crtend_android.o必须配对使用
第三种方法,用–sysroot也是可以的#!/bin/sh
NDK=/home/tim/android-ndk-r8e
SYSROOT=$NDK/platforms/android-9/arch-arm
CC="$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=$SYSROOT"
CFLAGS='-march=armv7-a -mfloat-abi=softfp -mfpu=neon'
LDFLAGS='-Wl,--fix-cortex-a8'
$CC $@
http://www.srombauts.fr/2011/03/06/standalone-toolchain/
#include <stdio.h>
#include <android/log.h>
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "hello-ndk", __VA_ARGS__))
int main(void)
{
printf("Hello from NDKn")
LOGI("Hello from NDK")
return 0
}
果然厉害,上面这段代码都可以这样编译./b9 -l log nl.c -o hn
用Makefile也能搞
CC = arm-linux-androideabi-gcc
CFLAGS = -Wall -g
LDFLAGS = -llog
SRC =hello-ndk.c
OBJ =$(SRC:.c=.o)
EXE =hello-ndk
all: $(SRC) $(EXE)
$(EXE): $(OBJ)
$(CC) -o $@ $^ $(LDFLAGS)
%.o: %.c
$(CC) -o $@ -c $< $(CFLAGS)
clean:
rm -f *.o $(EXE)
编译so库也是可以,厉害
CC = arm-linux-androideabi-gcc
CFLAGS = -Wall -g
LDFLAGS = -llog -shared
SRC =hello-ndk.c
OBJ =$(SRC:.c=.o)
EXE =libhello-ndk.so
还可以直接运行 gcc
/home/tim/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/home/tim/android-ndk-r10/platforms/android-3/arch-arm -lc -lm -g main.c -o mm
第4种方法,用ndk-build创建工程目录hello,然后在其下创建子目录jni
然后在jni下创建两个文件,一个是hello.c,另外一个是Android.mk,内容如下
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=hello.c
LOCAL_MODULE := helloworld
LOCAL_MODULE_TAGS := optional
nclude $(BUILD_EXECUTABLE)
其中 LOCAL_MODULE_TAGS := optional 这行可以不要
进入到hello目录下,运行下面的命令
# export NDK_PROJECT_PATH=`pwd`
# ndk-build
Compile thumb : helloworld <= hello.c Executable : helloworld Install : helloworld => libs/armeabi/helloworld
1.nvram文件存储路径的变化
O之前的路径为:"/data/nvram/APCFG/APRDEB/PRODUCT_INFO";
O之后皮明的路径变为:"vendor/nvdata/APCFG/APRDEB/PRODUCT_INFO";
2.SELinux 权限配置
在文件路径 device/mediatek/燃樱告sepolicy/basic/颂拿non_plat/system_app.te 中添加hal_client_domain(system_app,hal_nvramagent);
3.使用配置
在需要用到的app中的Android.mk文件配置LOCAL_STATIC_JAVA_LIBRARIES += vendor.mediatek.hardware.nvram-V1.0-java-static
类中使用获取方式:INvram agent = INvram.getService();要记得导包 import vendor.mediatek.hardware.nvram.V1_0.INvram
(1)、前后摄像头出现连接不上CCT,或者调试过程中断开有以下两种改法可供参考:
1)
文件路径:alps\vendor\mediatek\proprietary\custom\mt6739\cgen\cfgfileinc\CFG_Camera_File_Max_Size.h
相应的宏修改为: #define MAXIMUM_NVRAM_CAMERA_FEATURE_FILE_SIZE (5344)
2)、
(2)、预览或者录像被设置为固定帧率30帧
修改config文件 如
其中5000是行拦最低帧率5帧的意思。
(3)、录像模式如果打开eis模式界面会变暗
修改下面两个文件:
文件路径:
alps\vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6739\v1\adapter\MtkDefault\MtkDefaultCamParameter.cpp
修改方法:
把
//if(mpParamsMgr->getRecordingHint() &&mpParamsMgr->getVideoStabilization())
改为
if(mpParamsMgr->getRecordingHint() &&mpParamsMgr->getVideoStabilization() &&(!isEisWithDfr))
文件路径:
alps\vendor\mediatek\proprietary\custom\mt6739\hal\camera\camera_custom_eis.cpp
修改缺锋方法:
把
bool GetEisLinkWithDfr()
{
return true // true : dynamic frame rate off when eis onfalse : dynamic frame rate on when eis on
}
改为
bool GetEisLinkWithDfr()
{
return false // true : dynamic frame rate off when eis onfalse : dynamic frame rate on when eis on
}
(4)、概率性拍照的时候预览变暗
alps\vendor\mediatek\proprietary\hardware\mtkcam\legacy\platform\mt6739\core\featureio\pipe\aaa\state_mgr\aaa_state_precapture.cpp
IAeMgr::getInstance().setExp(m_SensorDevId, 3000)
目前实践证明:第一种改法有效,第二种改伏带晌法无效。
(5)、开启闪光灯拍照拍出来的照片是黑色的
修改的文件在turning文件夹里面
(6)、调整ISP参数后须要恢复出厂设置之后才可以连接上工具
修改路径:
vendor/mediatek/proprietary/hardware/mtkcam/legacy/platform/mt6739/core/featureio/drv/nvram/nvram_drv.cpp
修改方法:
if( a_eNvramDataType==CAMERA_DATA_PDC_TABLE)
{
err = readDefaultData(a_eSensorType, u4SensorID, a_eNvramDataType, a_pNvramData)
if (err != NVRAM_NO_ERROR)
logE("read default PDC Table error!")
return err
}
下面加一段:
if( a_eNvramDataType==CAMERA_NVRAM_DATA_FEATURE)
{
err = readDefaultData(a_eSensorType, u4SensorID, a_eNvramDataType, a_pNvramData)
if (err != NVRAM_NO_ERROR)
logE("read default Feature Table error!")
return err
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)