如何将c程序执行文件打包入APK中,两种方法

如何将一个可执行的文件打包到APK中,用户在下载APK后直接使用,我现在想到了两种方法:一种是将C程序直接打包到APK中,这种适合于独立执行程序或者你手上没有源码;另一种是将C程序作为库然后使用JNI来调用C程序;


解压缩即可看到APK如下目录:


|-AndroidManifest.xml

|-res

|-assets/

|-META-INF

|-class.dex

|-resource.arsc


1. 方法一

我们可以在/assets 和 /res/raw 中放置一些费标准的文件,但是需要通过输入流来访问。当用户将APK文件安装后,可以将非标准指定目录下的assets和res/raw下的可执行文件复制到到data目录下(注意:每一个APK在安装后都会在系统创建一个” /data/data/com.报名/ “ 此目录属于此APK的私有目录,然后你就可以在此目录中添加删除文件。有人说就象是linux home目录一样,的确很形象)。    下面是一个实现文件复制的代码,还有注意的地方是如果你的是可执行文件记得将此文件设置成可执行权限的。SDK API 9 以后有 File.Executable(true, true); API 8 及以下都不可使用此方法。


    public static boolean copyStream(InputStream in, OutputStream out) {
        Log.d(TAG, "copyStream("+ in + " ," + out+ ")");
        try {
            byte[] buf = new byte[8192];
            int len;
            while ((len = in.read(buf)) > 0)
               out.write(buf, 0, len); 
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
     }
	
    public static String getAppPrivateDir(Context ctx) {

        File dataDir = ctx.getDir("data", Context.MODE_PRIVATE);
        return dataDir.getAbsolutePath();

    }

    public static boolean copyAsset(Context ctx, String assetFile,
            String saveToFile) {

        Log.d(TAG, "copyAssets(" + assetFile + " -> " + saveToFile);
        File outputFile = new File(saveToFile);

        if (outputFile.exists()) {
            return true;
        }

        // init output stream(file)

        OutputStream out;

        try {
            out = new FileOutputStream(outputFile);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
            return false;
        }

        boolean copyResult = false;

        InputStream in = null;

        try {
            in = ctx.getAssets().open(assetFile);
            copyResult = copyStream(in, out);
            Log.d(TAG, "copy " + assetFile + " - " + copyResult);
        } catch (IOException e1) {
            e1.printStackTrace();
        } finally {
            // close input stream(file)
            try {
                if (in != null)
                    in.close();
            } catch (IOException e) {

            }
        }
        // close output stream (file)

        try {
            if (out != null)
                out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // return copy result

        // add file execute permission
        File fs = new File(saveToFile);
        try {
            fs.setExecutable(true, true);
        } catch (Exception e) {
            e.printStackTrace();
        }

        Log.d(TAG, "copyAsset() return " + copyResult);
        return copyResult;

    }

字符串处理优化方法

		StringBuilder sb = new StringBuilder();
		sb.append(getAppPrivateDir(this)).append("/server");



2. 方法二

将C程序作为库,在java层通过JNI来调用,此处不做细说。




要将C语言程序打包成应用,有几种方法可以选择。一种方法是将C程序直接打包APK,适用于独立执行程序或者没有源码的情况。另一种方法是将C程序作为库,然后使用JNI来调用C程序。以下是具体的步骤: 1. 如果你选择将C程序直接打包APK,你可以使用Android NDK来编译C代码并生成共享库文件(.so文件)。然后,你可以在Android应用使用JNI来调用这些库文件。这种方法需要你具备一定的Android开发经验。 2. 如果你选择将C程序作为库,然后使用JNI来调用C程序,你需要先编写一个Java类来调用JNI接口。然后,你需要使用Android NDK来编译C代码并生成共享库文件。最后,将生成的共享库文件和Java类一起打包APK。 无论你选择哪种方法,你都需要安装Android NDK并配置好开发环境。你可以在Android官方网站上找到详细的教程和文档来帮助你完成这些步骤。 请注意,将C语言程序打包成应用需要一定的开发经验和技能。如果你对Android开发不熟悉,建议先学习相关知识或寻求专业开发人员的帮助。 #### 引用[.reference_title] - *1* *3* [将c语言文件打包成exe可执行程序](https://blog.csdn.net/jgdabc/article/details/108427460)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [如何将c程序执行文件打包APK两种方法](https://blog.csdn.net/weixin_39740419/article/details/117033368)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值