android So库放入jar中

  项目需要,使用NDK和java开发库,这样就打包完后两个独立的个体:so和jar包,提供给客户不仅麻烦,还有两个版本要维护,因此想到把so放入jar包中。

  做法很简单就是把so库拷入指定目录下,然后再从此目录load到jar包中。

  传统load so方法:将so放入至libs/armeabi目录(arm架构),然后用以下代码load so库即可。

    static {
        System.loadLibrary("native-jni");
    }

so放入jar包中,则需将so库后缀去掉,放入assets资源文件夹下,然后以下面代码load。

public static boolean loadUrlSoLib(Context context){
       String PACKAGE_NAME = context.getPackageName();
       String DB_URL_LIB = "/data"
                + Environment.getDataDirectory().getAbsolutePath() + "/"
                + PACKAGE_NAME+"/"+"lib";
       String DB_PATH = "/data"
                + Environment.getDataDirectory().getAbsolutePath() + "/"
                + PACKAGE_NAME+"/"+"libs"+"/"+"native-jni.so";
       String DB_URL = "/data"
       + Environment.getDataDirectory().getAbsolutePath() + "/"
       + PACKAGE_NAME+"/"+"libs";
       if(Util.IS_LOGOUT){
           Log.e("drvLib", "new File(DB_URL_LIB).lastModified()- System.currentTimeMillis()="+(new File(DB_URL_LIB).lastModified()- System.currentTimeMillis()));
       }
       if(!(new File(DB_PATH).exists()) || (new File(DB_URL_LIB).exists() && (System.currentTimeMillis() - new File(DB_URL_LIB).lastModified() < 6000)))
       {
           try{
               InputStream is = context.getAssets().open("libnative-jni"); //libnative-jni  生成的SO去后缀名称                      String command = "chmod 777 " + DB_URL;
                Runtime runtime = Runtime.getRuntime();
                runtime.exec(command);
                File dir = new File(DB_URL);
                if (!dir.exists()) {
                    dir.mkdir();
                }
                FileOutputStream fos = new FileOutputStream(DB_PATH,false);
                byte[] buffer = new byte[1024*4];
                int count = 0;
                while ((count = is.read(buffer)) > 0) {
                    fos.write(buffer, 0, count);
                }
                fos.close();
                is.close();
           }catch(Exception e){
               e.printStackTrace();
               return false;
           }

       }
       System.load(DB_PATH);
       return true;
    }
时间: 2024-08-03 12:28:49

android So库放入jar中的相关文章

maven项目放入tomcat中找不到jar包

maven项目放入tomcat中时,总是报错,而且这些jar都是真实存在的,错误如下: maven eclipse tomcat java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener 解决办法:

.Net中把图片等文件放入DLL中,并在程序中引用

[摘要] 有时我们需要隐藏程序中的一些资源,比如游戏,过关后才能看到图片,那么图片就必须隐藏起来,否则不用玩这个游戏就可以看到你的图片了,呵呵. 本文就讲述了如何把文件(比如图片,WORD文档等等) 隐藏到DLL中,然后在程序中可以自己根据需要导出图片进行处理. 注:本站原创,转载请注明本站网址:http://www.beinet.cn/blog/ [全文] 第1步:我们要生成一个资源文件,先把要隐藏的文件放入到这个资源文件中 (资源文件大致可以存放三种数据资源:字节数组.各种对象和字符串) 首

OC--有这么一个 整数 123456789,如何将这个整数的每一位数,从末位开始依次放入数组中,并遍历 倒序输出字符串

有这么一个 整数 123456789,如何将这个整数的每一位数,从末位开始依次放入数组中,并遍历 1 NSInteger num=123456789; 2 NSString *str=[[NSString alloc]initWithFormat:@"%ld",num ]; 3 NSMutableArray *arr=[NSMutableArray array]; 4 for(NSInteger i=str.length-1;i>=0;i--){ 5 //从末位开始截取字符串,每

pyqt字符串分离开,放入列表中

string1 = ''''' the stirng Has many line In THE fIle ''' list_of_string = string1.split() print list_of_string #将字符串分离开,放入列表中 print '*'*50 def case_insensitive_sort(liststring): listtemp = [(x.lower(),x) for x in liststring] listtemp.sort() return [x

MyBatis 遍历数组放入in中

必须要遍历出数组的值放入in中 如果直接将"'2','3','4','5','6','7','8'" 字符串放入in中,只会查出 inv_operate_type的值为2的数据,因为myBatis将这个判断成了字符串,逗号失效了.

【算法与数据结构实战】线性表操作-实现A并B,结果放入A中

//数据结构与算法基础题1:线性表操作,实现A并B,结果放入A中 #include "stdafx.h" #include <iostream> #include <string> #include <vector> #include <algorithm> #pragma warning(disable:4996) using namespace std; int main() { vector<int> set_A, se

python:将一个数逆序列放入列表中,例如1234 => [4,3,2,1]

今天有小伙伴问题了一个题:将一个数逆序列放入列表中,例如1234 => [4,3,2,1].要求用递归实现.粗看这个题的话,很容易实现的:int 转成str ,然后倒序,再把列表里面的 str 转成 int.再来看递归:一般递归里面都是要有个结束条件,这个题的结束条件也很好确定,它是这个列表,列表有长度,每次pop 一个 元素,直到列表的长度 等于 0 的时候,那就可以结束了.先来看个普通的递归方法: def reverse_order_list1(lst:list, tmp=[]): if l

python:递归将一个数逆序列放入列表中

接上回:将一个数逆序列放入列表中,例如1234 => [4,3,2,1].要求用递归实现.不允许使用str和map,那就直接用除法和取模来做: lst = [] def int_to_list(tmp:int): division_number = tmp / 10 demo_number = tmp % 10 tmp3 = division_number - demo_number / 10 if tmp3: int_to_list(int(tmp3)) lst.append(demo_num

取装备名字放入变量中

GetUserItemName 的 命令的意思是:取指定位置的装备名字 放入某个变量格式: GetUserItemName 位置(0-12) S变量(0-99)说明: S变量是人物私有变量(0-99)例子: 把武器的名字放如S10变量中#IF#ACTGetUserItemName 1 10SendMsg 5 武器的名字: <$STR(S10)>查看提下你的 QF里 在哪使用了 GetUserItemName 然后看看 此版本的大体意思是什么 然后再替换脚本命令!! 原文地址:https://w