尝试运行简单的HelloWorld Unix可执行文件时:
#include <iostream>
using namespace std;
int main() {
cout << "Hello World!" << endl;
}
(通过g++ HelloWorld.cpp -o HelloWorld
编译(在Mac上)。该程序在我的Mac上运行,使用./HelloWorld并让它在Java环境中运行:
(HelloWorld.java -> working)
public class HelloWorld
{
public static void main(String args[])
{
String[] command = new String[]{"/system/bin/chmod", "744",
"/Developer/Java/HelloWorld" };
execute(command);
command = new String[]{"./HelloWorld"};
execute(command);
}
public static void execute(String...command)
{
StringBuilder log = new StringBuilder();
try
{
BufferedReader br;
String line;
ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectErrorStream(true);
Process proc = builder.start();
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
while ( (line = br.readLine()) != null)
System.out.println(line + "\n");
}
catch (IOException e) {
log.append("General IOException:\n" + e.getMessage() + "\n");
}
catch (InterruptedException e) {
log.append("Error:\n" + e.getMessage() + "\n");
}
}
}
在我的Android应用程序的java代码中,我首先将可执行文件复制到getBaseContext().getDataDir()
,这样可以正常工作。要更改权限,我正在使用以下内容:
command = new String[]{"/system/bin/chmod", "744",
getAssetsPath() + "/HelloWorld" };
execute(pv, command);
并尝试通过以下方式运行程序:
command = new String[]{"." + getAssetsPath() + "/HelloWorld"};
terminal(tv, command);
注意,我使用以下功能:
public File getAssetsDir() {
return getBaseContext().getDataDir();
}
public String getAssetsPath() {
return getAssetsDir().getAbsolutePath();
}
public void execute(TextView tv, String...command)
{
tv.setText("Starting Terminal.\n");
StringBuilder log = new StringBuilder();
try
{
BufferedReader br;
String line;
ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectErrorStream(true);
Process proc = builder.start();
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
while ( (line = br.readLine()) != null)
log.append(line + "\n");
}
catch (IOException e) {
log.append("General IOException:\n" + e.getMessage() + "\n");
}
catch (InterruptedException e) {
log.append("Error:\n" + e.getMessage() + "\n");
}
tv.setText(log.toString());
}
如前所述,这将导致TextView内部出现以下错误(在Pixel_XL_API_25上测试):
syntax error: '__TEXT' unexpected
希望你能帮我找到这个问题的原因。提前谢谢。
编辑: 如果你想知道我为什么要使用Unix可执行文件来做这么简单的事情:这只是为了测试。实际上,我想运行其他更复杂的程序/库,这些程序/库很难通过ndk使用,因为这个库没有cmake,只有“普通”make。
答案 0 :(得分:0)
答案是,编译器不是正确的编译器。如果你想在另一台设备上运行它,你可以在那里编译它或使用一些交叉编译器,我想。
现在的问题是:哪种编译器可以工作?我找到了这个建议(How to compile and run a C/C++ program on the Android system):
arm-linux-gnueabi-g++ -static -march=armv7-a HelloWorld.c -o HelloWorld
但这不适用于这个特定的星座。