在Android APP中运行Native程序

这里指的的Native程序,就是Linux上用C标准库写下来的各种程序

需要在Android上打包运行lighttpd+php-cgi,这就涉及到使用交叉编译出这些程序并运行。

关于交叉编译,主要注意的要点就是使用哪个编译器,一般都是使用arm-none-linux-gnueabi-gcc

Android上没有使用libc,而是使用自家的Bionic,这也就意味着没法调用动态标准库函数,所以交叉编译需要使用静态编译的选项进行编译,不要挂上任何的外部库,才能保证C/C++程序可以独立在Android下运行,并且不会触发Android的PIE机制。

如何在APP中调用这些程序,其实挺简单的,只要保证了你编译的程序OK,那么在APP中直接通过shell来调用程序运行就可以了。

但是需要注意权限的问题,android上普通的APP,是没有太多的文件操作权限的。这也就是意味着它只能自由操作APP自己的私有目录下的程序和数据,只要我们把Native程序放在APP私有目录下,我们也就可以随便运行很多Native程序(当然需要root权限的,还是不行),这种情况下的Native程序,运行时候的UID继承自APP,这样Native程序也可以随便操作该APP私有目录下的数据( •̀ ω •́ )y

把数据限制在这个私有空间内,这样就不会去污染系统相关的目录了,不过也没有这个权限,啊哈哈哈哈

咱把Native Linux程序压缩好,放在了App的assets目录下,然后在App首次运行时候,将数据解压到App的私有目录下,之后用shell来运行。

下面的解压部分

public static void unZipServer(Context context) throws Exception{
            String fileDir=context.getFilesDir().getAbsolutePath();
            ZipInputStream unzipStream = new ZipInputStream(context.getClass().getClassLoader().getResourceAsStream("assets"+File.separator+"WEB.zip"));
            ZipEntry zipEntry;
            String szName;
 
        while((zipEntry=unzipStream.getNextEntry())!=null){
            szName=zipEntry.getName();
            if(zipEntry.isDirectory()){
                szName=szName.substring(0,szName.length()-1);
                File outFolder=new File(fileDir+File.separator+szName);
                outFolder.mkdir();
            }
            else{
                File file = new File(fileDir+File.separator+szName);
                file.createNewFile();
                FileOutputStream out = new FileOutputStream(file);
                int len;
                byte[] buffer = new byte[1024];
                while((len=unzipStream.read(buffer))!=-1){
                    out.write(buffer,0,len);
                    out.flush();
                }
            }
        }
        unzipStream.close();
    }

部分shell操作

Runtime runtime=Runtime.getRuntime();
runtime.exec("chmod 777 "+SERVER_PATH);  //give the native aplication x permission
runtime.exec("."+SERVER_PATH); //Run your native application

后面写交叉编译的东西。

Leave a Reply

Your email address will not be published. Required fields are marked *