1. 程式人生 > >android可執行檔案交叉編譯和執行

android可執行檔案交叉編譯和執行

簡介

android一般使用java進行開發,但是有時候我們可能需要使用到native語言,使用C/C++進行編譯執行. 現在我們可以搜到很多使用android-studio和NDK進行編譯so執行的方式,我就不再贅述了,我們這裡主要講如何利用已經有的NDK工具鏈,直接進行編譯可執行檔案和執行的方法

具體方法

系統環境

我使用的kali linux,可以認為是debian 8系統.
如果是windows可以使用cygwin.

編譯工具鏈

如果你有NDK,在/Sdk/ndk-bundle/目錄下,那麼可以不用下載交叉編譯工具鏈,否則你需要手動安裝工具鏈,網上有很多方法,這裡不再贅述. 建議通過android sdk manager下載ndk,這樣既可以用於so的編譯,也可以提取出具體工具鏈進行編譯.

更改環境變數

如果你的目錄比較冗長,那麼沒有必要每一次都手動去指定工具,我們選擇更改環境變數的方式.
在~/.bashrc檔案末尾新增:

export SYSROOT="$NDK/platforms/android-24/arch-arm"
export ANDROID_GCC="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=$SYSROOT -pie -fPIE"

$NDK為你的ndk安裝目錄,可能名為ndk-bundle.
SYSROOT為交叉編譯時所需要的一些include檔案等的目錄,需要在編譯時手動指定,因為我們不能使用pc電腦的include檔案
-pie 和 -fPIE為指定用地址無關程式碼方式來編譯檔案,因為在android 4.4之後加入了保護,如果沒有這個選項,android會拒絕執行,出現以下錯誤

error: only position independent executables (PIE) are supported.

關於版本,裡面的數字基本就是版本,可以根據你手裡的具體情況進行更改,重點為找到這個類似目錄下的相應版本的檔案(如arm-linux-androideabi-gcc)

編譯

$ANDROID_GCC -o output input.c

執行

由於android的一些許可權機制,位於sdcard和sdcard1的目錄預設都是不可執行的,也就是說,如果adb push到這兩個目錄下還是會出現沒有許可權執行. /data/目錄是可以執行的,可是不能直接放在這個目錄下,因為沒有許可權直接放在這個目錄. 所以我們的方法是放到/data/local/tmp/目錄 這個目錄下的檔案可以執行,且可以通過adb push放進去

adb push output /data/local/tmp/
adb shell
cd /data/local/tmp
./output

相關推薦

android執行檔案交叉編譯執行

簡介 android一般使用java進行開發,但是有時候我們可能需要使用到native語言,使用C/C++進行編譯執行. 現在我們可以搜到很多使用android-studio和NDK進行編譯so執行的方式,我就不再贅述了,我們這裡主要講如何利用已經有的NDK工

用dos命令編譯執行java檔案

1.安裝JDK,配置好環境變數 2.在命令列視窗進入java檔案所在路徑(用cd命令),假設HelloWorld.java檔案在C盤根目錄     3.在該路徑下輸入如下命令: javac. -d . HelloWorld.java  執行後可到j

使用命令列視窗編譯執行java檔案

1.使用記事本或者編輯器寫一個HelloWorld.java檔案 public class HelloWorld{        public static void main(String[] args){               System.out.print

Gentoo 安裝日記 13 (配置核心 :執行檔案安格式網路)

接:http://nvd11.blog.163.com/blog/static/20001831220127254852277/Executable file formats / Emulations ---> [*] Kernel support for ELF binaries           

Android APP編譯執行原理

在本篇中,主要介紹Android平臺應用程式的執行原理,在閱讀了SDK文件中“Application Fundamentals”一篇的內容後,根據自己的理解繪製了下面的示意圖:       每個應用程式安裝後,系統便會為其分配一個獨立的儲存空間,所謂的“Securi

android編譯執行python版的tensorflow

    Tensorflow採用python作為主語言,雖然tensorflow提供了運行於android的例子,但採用是java。基於原始碼,採用NDK,可以編譯出android版本的tensorflow。     編譯環境採用ubuntu 16.04,NDK使用r13b

在linux命令列中編譯執行java檔案

同時載入編譯多個jar包和java檔案 在個人平常使用或者當我們把程式碼部署到linux伺服器上的時候,我們經常需要通過命令列編譯和執行java檔案,網上關於這個的方法大多是通過 javac -cp filePath/jarName.jar j

Linux鞏固記錄(1) java項目的編譯執行

mce frame cati readfile 知識 4.3 sse apach ast 由於要近期使用hadoop等進行相關任務執行,操作linux時候就多了 以前只在linux上配置J2EE項目執行環境,無非配置下jdk,部署tomcat,再通過docker或者jenk

java --代碼編譯執行的整個過程

pan home 面向 share 簡單的 下一條 c++ oot 註解 1. 什麽是 JVM   JVM 是 Java 的核心和基礎,在 Java 編譯器和 os 平臺之間的虛擬處理器。它是一種基於下層的操作系統和硬件平臺並利用軟件方法來實現的抽象的計算機,可以在上面執行

window下如何使用文本編輯器(如記事本)創建、編譯執行Java程序

得到 輸入 ava 執行 world! ext tex 目錄 源代碼 window下如何使用文本編輯器(如記事本)創建Java源代碼文件,並編譯執行 第一步:在一個英文目錄下創建一個 .text 文件 第二步:編寫代碼 第三步:保存文件 選擇 文件>另

JVM原理(Java代碼編譯執行的整個過程+JVM內存管理及垃圾回收機制)

變化 並行 colspan 同時 簡單的 table 目前 動態 中心 轉載註明出處: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特點主要是指操作系統裝入JVM是通過jdk中Java.ex

Linux環境下c程序的編譯執行

環境變量 動態 main.c tor direct 環境 沒有 stdlib.h share 1 單個文件的編譯和執行創建main.c文件,內容如下: #include <stdio.h> #include <stdlib.h> int main

微服務分散式事務實戰(四)分散式事務處理器的下載,編譯執行

分散式事務處理器的下載,編譯和執行 (1)下載分散式事務處理器工程原始碼 https://github.com/codingapi/tx-lcn/ (2)匯入eclipse (3)修改配置檔案 填寫分散式事務伺服器地址,redis地址 ,註冊中心地址 ################

Linux Kernel 0.01 的編譯執行

Linux Kernel 0.01 的編譯和執行 本文操作環境均在 Linux 系統中實現。 ================================================================================== 一、準備工作 下面說明的內容要

計算機編譯執行的定義

編譯:包括編譯和連結兩個過程。編譯部分,是把原始檔(程式碼)轉換成機器可以識別的二進位制語言,這個過程是針對每一個原始檔的。連結,是把編譯生成的二進位制檔案,組合成為一個系統可以執行的可執行檔案。這兩部分整體也叫編譯。也就是說,廣義的編譯,就是把程式碼,轉換成可執行檔案。執行:把編譯出來的可

Linux環境下c程式的編譯執行

1 單個檔案的編譯和執行建立main.c檔案,內容如下: #include <stdio.h> #include <stdlib.h> int main(void){ printf("Hello world!\n"); return 0; };   編譯:

無IDE時編譯執行Java

最近 Java subreddit 出現了一篇”在沒有IDE的情況下編譯Java包” 的帖子,這個帖子丟擲了這麼一個問題,“是否存在一個命令可以編譯一組處於同一資料夾下獨立包內的java檔案的方法(這稱之為bin),同時怎樣執行新的類檔案呢?” 它的提出者 kylolink解釋說

Java 程式碼編譯執行的整個過程

Java 位元組碼的執行是由 JVM 執行引擎來完成,流程圖如下所示: Java 程式碼編譯和執行的整個過程包含了以下三個重要的機制: Java 原始碼編譯機制 類載入機制 類執行機制 Java 原始碼編譯機制 Java 原始碼編譯由以下三個過程組成: 分析和輸入到符

windows命令列下編譯執行c/c++

我看了半天,也沒找到window命令列下編寫程式,說明這個不可取。 那我們只有利用已有檔案來編譯與運行了。 假設我在E盤裡有個.cpp檔案,我改如何編譯和執行她尼? 第一步:我可以直接到該目錄的檔案管理器視窗位址列執行命令:cmd,這樣就可以直接到達所需檔案的目錄。如下圖   &nbs

Linux環境下如何編譯執行c程式

1 單個檔案的編譯和執行 建立main.c檔案,內容如下:  編譯: 執行: 2 多個檔案的編譯和執行建立sum.c檔案,內容如下: 建立main.c檔案,內容如下:   編譯:    生成可執行檔案,檔名為main: 執行程式: