當前位置:首頁 » 安卓系統 » androidc編譯

androidc編譯

發布時間: 2023-01-31 23:28:35

1. 怎麼將c代碼編譯成android可執行程序

(1) 如果你開發Android上層APP,使用Android NDK,將下面c語言開發的lib通過JNI介面給上層APP使用。
(2) Android底層本來就是linux,如果是搞底層的東西,這和在Linux下開發C語言程序沒什麼區別。

2. Android上如何用C語言編程

害哥搞這個離線包搞了個把小時。為了清楚,上個圖: 敲個LS,什麼東西都沒有,這個目錄是cygwin的安裝目錄下面的home文件夾下的用戶名文件夾。接下來是配置與Android相關的。在home/用戶名,這個文件夾下有一個文件為.bash_profile,打開它,到最後添加兩行NDK的環境變數:NDK_ROOT=/cygdrive/d/android-ndk-r6export NDK_ROOT上面的意思是,ndk的目錄是,d:/android-ndk-r6添加完之後,關閉Cygwin重新啟動一下,然後敲入cd $NDK_ROOT,是否進入到ndk的目錄了?否則就看看哪個字母錯了。在ndk的目錄下samples下有很多例子,隨便弄個就可編譯了。下面是新建一個項目,以對C語言在項目中的位置更清楚。打開Eclipse新建一個Android項目,取名hellojni,為了清晰,便於維護,及各種各樣的好處,JNI的JAVA代碼單獨一個類,單獨一個包。其實最好能不用JNI就別用JNI,這東西負作用巨大,特別是在用到JNI復雜的地方,什麼內存啊,類型啊,哪裡調用的方法,異常啊,可靠性都非常麻煩。非要用JNI的復雜功能,做好兩件事,做之前充分設計,設計之前充分學習一下JNI文檔。當然對於一些簡單的應用,那隻需要充分仔細。作好參數,返回值的檢查,記得釋放內存就行了。

3. 如何利用android studio 編譯c code

學習 android 逆向分析過程中,需要學習 Arm 指令,不可避免要編寫一些 test code 並分析其指令,這是這篇文檔的背景。

在目前 android 提供的開發環境里,如果要編寫 c / cpp code, 一般是通過 ndk 開發套件,基本方法就是在
windows 或 linux 發行版上下載 ndk 環境,然後編寫 c / cpp code 然後編寫 Android.mk 文件,最後用
ndk-build 等工具進行編譯,編譯出來的可執行文件再通過 adb push 的方式提交到 devices 或 emulator
運行,如果要分析其指令,需要下載 android 提供的 prebuilts binutils 工具集(如android 源碼
prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/arm-linux-androideabi/bin/
目錄),如果你在linux上用file命令查看一下這些工具,會發現 :

root@ubuntu:bin# file objmp
objmp: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped

它們是x86架構的,這樣,你要分析devices或emulator里的elf文件,需要adb pull 下來,放在本地的linux環境或者windows里,用上述prebuilt工具分析。

稍微思考一下就會發現上述 ndk
的方式,對我們的需求來說有點太復雜了,我們真正希望的是像在標准linux發行版上那樣,可以用vi/vim等編輯工具寫 c/cpp
code,然後用 gcc /g++ 等編譯工具編譯,然後能直接運行或者用gdb調試,
或者用readelf/objmp等命令查看elf結果和匯編碼。問題變成了:如何在android上實現這一切?

下面的方式是經過本人收集和實際測試證明可行的,我的環境是:

目標機:小米2手機, android4.4.4, miui 6.3.5

本地機: win7

效果:在本地機adb目標機的shell, 然後用vi寫 c/cpp code, 直接在shell上用gcc編譯,用objmp分析指令

實現步驟如下:

1. 首先安裝 busybox apk . 這個app提供了後續需要的 busy vi, busy tar 等工具

2. 下載 adb putty ,http://yunpan.cn/cZ5x9UrDFUDdK (提取碼:e70e)

這個工具用來做終端,這里為什麼不用win7自帶的cmd或者其他增強版如 powerCmd 呢? 因為用 windows 的 cmd 終端,adb shell 連接上手機後,執行 busybox vi 等命令,會出現亂碼,參考http://www.hu.com/question/20624475, 用這款 adb putty 終端則可以正常使用。

3. 下載 gcc arm,http://yunpan.cn/cZ5YVZzbvJqq4 (提取碼:80b8)

4. 手機的Android系統能在手機上用C/C++編程嗎

可以,有個手機編程軟體叫做C4droid,專門用來編譯C/C++文件的,要下載支持庫,不大的,你可以看看

5. 手機能否裝C語言編譯器

可以裝,不過需要安卓手機

安裝步驟如下:

1、我們打開谷歌應用商店。在搜索框里輸入mobile c查找應用程序。下載並安裝好

6、可以看到這里正確的輸出了Hello World字元串。

6. 如何建立android的C/C++交叉編譯環境

Android的底層是純粹的linux內核,可以簡單的理解為上面跑了個Dalvik Java虛擬機而
已。因此,構建android上C/C++的交叉編譯環境也就成為了一個很大的需求。特別是對於已經取得root許可權的機器,如果能直接運行按需編譯的二進制文件,那麼將可以做很多有意義和有趣的事情。
很不幸,Google沒有直接給出如何建立這個交叉編譯環境,但是我們可以藉助Google提供的強大的NDK (Native Development Tools)來達到這一目的。
NDK的本來目標是編譯得到.so動態鏈接庫文件,然後通過JNI提供給上層的Java調用,從而實現C/C++程序的簡易遷移。而編譯.so和編譯成二進制可執行文件的過程是完全一樣的,這就給了我們可以發揮的空間。

7. 在android中如何編譯連接 c 的可執行文件

1. 在./development目錄下創建一目錄 如:myhello
2. 進入hello目錄,在其下編寫自己的.c文件,如: myhello.c
#include <stdio.h>
int main()
{
printf("hello world\n");
exit(0);
//return 0;
}
3. 在hello目錄中,編寫Android.mk, 內容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := myhelloworld
LOCAL_SRC_FILES := myhello.c
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
4. 回到Android源代碼頂層目錄,進行編譯,make myhelloworld
5. 生成的可執行文件位於:out/target/proct/lotus/system/bin/ 目錄下
6. adb push 到手機 /data 目錄下,然後進入adb shell,到data目錄下,執行./myhelloworld 皆可

手動編譯連接【arm-eabi-gcc 的目錄隨andorid的版本而有變化,還有就是需要鏈接的文件如果比較多時,需要很多-l 就很麻煩了】
7、編譯成目標文件:
#$(yourAndroid)/prebuilt/linux-x86/toolchain/[arm-eabi-4.2.1]/bin/arm-eabi-gcc -I bionic/libc/arch-arm/include/ -I bionic/libc/include -I bionic/libc/kernel/common -I bionic/libc/kernel/arch-arm -g -c helloworld.c -o hello.o
8、生成可執行代碼:
#$(yourAndroid)/prebuilt/linux-x86/toolchain/[arm-eabi-4.2.1]/bin/arm-eabi-gcc -nostdlib -Bdynamic -Wl,-T,build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,noreloc -o helloworld -Lout/target/proct/[generic]/obj/lib -Wl,-rpath-link=out/target/proct/[generic]/obj/lib -lc hello.o -entry=main

其中[ ]中部分根據實際情況修改

**************************************************
實驗:
1. 建目錄(my Android)/development/test, 在該目錄下新建 Android.mk和fb_test.c文件

2. Android.mk文件

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := myfbtest
LOCAL_SRC_FILES := fb_test.c
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)

3. 以下為fb_test.c
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <linux/kd.h>

#include <stdio.h>

#define FBBIT_PER_PIXEL 32
#define FBBIT_PIXEL_IMAGE 16
#define PIXELS_WIDTH_BYTE 4
#define BYTE_PER_PIXEL 3
#define FB_GRAPHICS_PATH "/dev/graphics/fb0"
#define DEV_TTY0_PATH "/dev/tty0"

#define DISPLAY_ERROR -1
#define DISPLAY_SUCCESS 0

#define GET_BATTERYCAPACITY_ERR -1

#define MAX_STR 255

static struct {
int fd;
void *pixels;
struct fb_fix_screeninfo fixed;
struct fb_var_screeninfo var;
int align_xres;
} fb;

int getBatteryCapacity(void)
{
FILE *in;
char tmpStr[MAX_STR + 1];
char capfile[] = "/sys/class/power_supply/battery/capacity";

if (capfile == NULL)
return GET_BATTERYCAPACITY_ERR;

in = fopen(capfile, "rt");
if (in == NULL)
return GET_BATTERYCAPACITY_ERR;

if (fgets(tmpStr, MAX_STR, in) == NULL) {
printf("Failed to read battery capacity!\n");
fclose(in);
return GET_BATTERYCAPACITY_ERR;

}

printf("Battery capacity(ascii): %s\n", tmpStr);
fclose(in);

return 0;//atoi(tmpStr);
}

static int vt_set_graphicsmode(int graphics)
{
int fd, r;
fd = open(DEV_TTY0_PATH, O_RDWR | O_SYNC);
if (fd < 0)
return DISPLAY_ERROR;
r = ioctl(fd, KDSETMODE, graphics);
close(fd);
return r;
}

int display_init(void)
{
fb.fd = open(FB_GRAPHICS_PATH, O_RDWR);
if (fb.fd < 0)
return DISPLAY_ERROR;

if (ioctl(fb.fd, FBIOGET_FSCREENINFO, &fb.fixed) < 0)
return DISPLAY_ERROR;
if (ioctl(fb.fd, FBIOGET_VSCREENINFO, &fb.var) < 0)
return DISPLAY_ERROR;
fb.align_xres = fb.fixed.line_length /
(fb.var.bits_per_pixel >> BYTE_PER_PIXEL);

fb.pixels = mmap(0, fb.fixed.line_length * fb.var.yres_virtual,
PROT_READ | PROT_WRITE, MAP_SHARED, fb.fd, 0);
if (fb.pixels == MAP_FAILED)
return DISPLAY_ERROR;

vt_set_graphicsmode(KD_GRAPHICS);

memset(fb.pixels, 0, fb.fixed.line_length * fb.var.yres_virtual);
//display_update(fb.pixels, fb.align_xres, fb.var.yres);
fb.var.activate = FB_ACTIVATE_FORCE;
ioctl(fb.fd, FBIOPUT_VSCREENINFO, &fb.var);

printf("display_init ok\n");

return DISPLAY_SUCCESS;
}

void display_on(void)
{
ioctl(fb.fd, FBIOBLANK, FB_BLANK_UNBLANK);
}

void display_off(void)
{
ioctl(fb.fd, FBIOBLANK, FB_BLANK_POWERDOWN);
}

int main()
{
display_init();
display_off();//關顯示屏

getBatteryCapacity();
sleep(5);

display_on();//開顯示屏

return 0;
}

8. 有能在Android系統上運行的c語言編程軟體嗎,推薦一下

C4droid是款Android設備上的C/C++程序編譯器[2] ,默認以tcc(tiny c compiler)為編譯器,可以選擇安裝gcc插件(20mb,只有root用戶可以使用),選用gcc後,可以用sdl(簡單直控媒體層庫,需安裝sdl plugin for c4droid)和qt(nokia官方開發庫,需安裝sdl plugin for c4droid)。也可以開發native android app(需安裝sdl plugin for c4droid),就像google ndk一樣。軟體支持代碼高亮,編譯時間隨cpu主頻而定,主頻越高編譯越快。gcc插件版本4.7.2提供了示列程序,包含sdl,android native,qt和命令行測試程序源碼。

9. 有沒有安卓手機c語言編譯軟體

有的 我現在也正在用C4 droid 我是看視頻學的,我現在正在看的是夏老師的,感覺還不錯,比較適合像我這樣0基礎的。這個比較吸引我的地方就是講的一聽就能聽懂。而且很多概念都有形象的比喻,例如把變數比如成盒子。把變數賦值比喻成往盒子里放東西等等很多這樣的比喻。感覺特別容易理解。

熱點內容
jdk源碼怎麼看 發布:2024-05-07 20:18:22 瀏覽:517
編程c語言自學書 發布:2024-05-07 20:12:03 瀏覽:421
usb大容量存儲驅動 發布:2024-05-07 19:02:01 瀏覽:815
紅米1s沒有存儲空間 發布:2024-05-07 18:59:09 瀏覽:505
妖雲解壓密碼 發布:2024-05-07 18:50:08 瀏覽:1002
sql語句等於怎麼寫 發布:2024-05-07 18:05:46 瀏覽:816
我的世界電腦版第三方伺服器大全 發布:2024-05-07 18:00:46 瀏覽:627
主伺服器的ip地址 發布:2024-05-07 17:58:50 瀏覽:546
組伺服器打電腦游戲 發布:2024-05-07 17:46:19 瀏覽:866
java的文件路徑 發布:2024-05-07 16:55:29 瀏覽:293