如何为 Android 编译和 运行 一个简单的 C 代码?

How to compile and run a simple C code for Android?

这是基本的 C 源代码:

#include <stdio.h>
int main(void) {
    puts("hello world!");
    return 0;
}

我可以使用 NDK 工具链为 Android 编译:

aarch64-linux-android21-clang test.c

它生成一个 a.out 文件,我将其传输到 Android 设备:

adb push a.out /data/local/tmp
adb shell chmod 777 /data/local/tmp/a.out

当我尝试 运行 它时:

adb shell /data/local/tmp/a.out

我收到消息:“/system/bin/sh:/data/local/tmp/a.out:没有这样的文件或目录”

我做错了什么?

在我的例子中,我不得不使用“armv7a-linux-androideabiXX-clang”进行编译,然后就可以了。 XX 必须替换为 API 版本。

在我的 windows 系统上,clang 二进制文件和脚本位于文件夹“D:\AndroidSdk\ndk.1.6352462\toolchains\llvm\prebuilt\windows-x86_64\bin”

可以使用的最新脚本是“armv7a-linux-androideabi29-clang++.cmd”,在我的例子中,可以在三星 A3 手机上为 运行 编译 C 源代码.

我认为这是因为这不是 64 位内核,我是在 Eugene Sh 在对这个问题的评论中问我之后才弄明白的(如果他添加了答案,那么我会接受)。

您可以使用此 nodejs 脚本自动构建和测试您的 c/c++ 程序 android

 let cpp=`
#include<iostream>
#include<string> 
using namespace std;
int main(){
  cout<<"hellow word"<<endl; 
  return 0;
}
` 
let args=['--target=armv7a-linux-androideabi23']
let cpu="armeabi-v7a" 
wfs('test.cpp',cpp)
args.push("test.cpp")     
 args.push("-static-libstdc++")
 //in case you want to build sharedlib uncomment next line
 //args.push("-shared")

lg=run(runners.clang,args)

lg=run(runners.adb,'push a.out /data/local/tmp/a.out')

//in case -static-libstdc++ not used uncomment next line;
//copy c++_shared to same dir where to a.out
//run(adb,'push c++_shared.so /data/local/tmp/c++_shared.so')
 
let shellcmd=[];
shellcmd.push("cd /data/local/tmp")
//in case -static-libstdc++ not used uncomment next line;
// shellcmd.push("export LD_LIBRARY_PATH=.")
shellcmd.push("chmod +x a.out")  
shellcmd.push("./a.out")  
// a.out excution result
let output=run(runners.adb,`shell "${shellcmd.join("&&")}"`)
lg(output)








            //++++++++++utilis++++++++++
            function lg(...args){
            console.log(...args)
            }

            function run(cmd,args){
            if(args) cmd= cmd+" "+args.join(" ");
            return require('child_process').execSync(cmd);
            }

            function wfs(p,data){
            require("fs").writeFileSync(p,data)
            }