如何为 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)
}
这是基本的 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)
}