精华内容
下载资源
问答
  • so文件
    万次阅读 多人点赞
    更多相关内容
  • 解析so文件

    热门讨论 2015-10-22 18:47:56
    解析so文件的工具类,很实用的一个工具类。
  • ijkplayer已编译好的各个so文件

    热门讨论 2017-03-31 16:03:06
    包含各个CPU架构的so文件:arm64-v8a armeabi armeabi-v7a x86 x86_64 导入ijkplayer-java即可直接使用
  • 前言一道so文件动态加解密的CrackMe,运行时解密要执行的函数,且在执行后立马加密CrackMe:dex文件加的数字壳,so文件无壳,因为反调试,所以so文件采用全静态分析分析环境:脱壳工具:... 分析过程2.1 脱壳拿到FART...

    作者论坛账号:genliese

    1. 前言

    一道so文件动态加解密的CrackMe,运行时解密要执行的函数,且在执行后立马加密CrackMe:dex文件加的数字壳,so文件无壳,因为反调试,所以so文件采用全静态分析

    分析环境:脱壳工具:FART

    GDA

    IDA

    Frida

    PyCharm

    VSCode

    2. 分析过程

    format,png

    2.1 脱壳

    format,png

    拿到FART定制ROM下跑,得到想要的dex文件,数字壳抹去了前八个字节的dex文件魔数,需要填充一下,才能用GDA进行解析

    2.2 定位校验函数

    format,png

    format,png

    从上图可知,校验函数为libnative-lib.so文件中的test函数

    2.3 分析so文件

    首先分析so文件提前加载的三处函数(init、init_array、JNI_OnLoad)

    用readelf -d查看是否有init、init_array

    format,png

    发现只有init_array,用IDA查看init_array数组中的函数

    format,png

    datadiv_decode4192348989750430380函数的作用是解密字符串

    format,png

    接着分析JNI_OnLoad函数,导入jni.h头文件,用于解析JNI函数

    format,png

    接着分析ooxx函数

    format,png

    sub_8930函数的内容如下:

    format,png

    其中sub_8A88函数的作用是获取so文件的加载基址,如下:

    format,png

    获取so文件的加载基址的方法是,通过读取CrackMe进程的内存映射文件maps,然后通过搜索切割字符串得到的,maps文件的内容如下:

    format,png

    sub_8930函数接着调用了sub_8B90函数用于获取xxoo函数的相对虚拟地址和大小,如下:

    format,png

    format,png

    其中步骤5——通过计算,得到xxoo函数在符号表中的索引k中使用的算法和文章:简单粗暴的so加解密实现中第四部分——基于特定函数的加解密实现介绍的查找函数的算法完全一致,可以导入elf.h头文件解析ELF文件的结构体

    在sub_8930函数中,根据上面得到的so文件的加载基址、xxoo函数的相对虚拟地址和大小等信息,接着就是修改内存属性,解密xxoo函数,还原内存属性,最后刷新指令缓存,分析完成后的sub_8930函数如下:

    format,png

    其中解密用到的密钥存储在byte_1C180中,是在bss段,在文件中是未初始化的,所以我们需要在运行时,从内存中dump下来

    3. 解密函数

    3.1 解密需要的数据

    使用打开文件的方式进行解密,而不是运行时解密,所以需要以下数据xxoo函数的文件偏移(xxoo_offset):

    xxoo函数的大小(xxoo_size)

    密钥(xor_array)

    获取xxoo函数的文件偏移(xxoo_offset)

    xxoo函数的文件偏移 = .txt段的文件偏移 + xxoo函数相对于.txt段的文件偏移xxoo函数相对于.txt段的文件偏移 = xxoo函数的相对虚拟地址 - .txt段的相对虚拟地址

    通过上面两个公式可得xxoo函数的文件偏移 = .txt段的文件偏移 + xxoo函数的相对虚拟地址 - .txt段的相对虚拟地址

    .txt段的文件偏移和.txt段的相对虚拟地址在.txt的区段头中,xxoo函数的相对虚拟地址在符号表中,如下:

    format,png

    format,png

    所以xxoo_offset = 0x8dc5

    获取xxoo函数的大小(xxoo_size)

    如上图,xxoo_size = 584

    获取密钥(xor_array)密钥在内存中的起始地址:so文件的加载基址 + 0x1C180

    密钥的大小:xxoo_size - 61 - 59 = 464

    根据上述信息,通过frida脚本dump内存即可得到密钥,脚本如下:复制代码隐藏代码//获取用于异或解密的密钥

    Java.perform(function (){

    var currentApplication = Java.use("android.app.ActivityThread").currentApplication();

    //1.获取app的文件目录files,/data/user/0/$package_name/files/

    var dir = currentApplication.getApplicationContext().getFilesDir().getPath();

    //2.获取so文件信息

    var libso = Process.getModuleByName("libnative-lib.so");

    var byte_1C180_addr = 0x1C180

    //3.获取用于异或解密的密钥的起始地址

    var xor_array_base  = ptr(Number(libso.base) + byte_1C180_addr)

    //4.用于异或解密的密钥的大小

    var xor_array_size = 464;

    console.log("[xor_array_base]: ", xor_array_base);

    console.log("[xor_array_size]: ", ptr(xor_array_size));

    //5.拼接密钥文件路径

    var xor_array_path = dir + "/" + "xor_array" + "_" + xor_array_base + "_" + ptr(xor_array_size);

    //6.打开密钥文件

    var file_handle = new File(xor_array_path, "wb");

    if (file_handle && file_handle != null) {

    //7.修改密钥所在内存的属性为可读

    Memory.protect(xor_array_base, xor_array_size, 'r');

    //8.读取密钥到缓冲区

    var xor_array_buffer = xor_array_base.readByteArray(xor_array_size);

    //9.把缓冲区内容写入文件

    file_handle.write(xor_array_buffer);

    //10.刷新缓存

    file_handle.flush();

    //11.关闭文件

    file_handle.close();

    console.log("[dump]: ", xor_array_path);

    }

    });

    3.2 解密脚本复制代码隐藏代码import mmap

    # 密钥数组

    xor_array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,

    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,

    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,

    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,

    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,

    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,

    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,

    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,

    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,

    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,

    0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,

    0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,

    0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,

    0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,

    0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,

    0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,

    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,

    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,

    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,

    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,

    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,

    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,

    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,

    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,

    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,

    展开全文
  • 将Python文件打包成so文件

    千次阅读 热门讨论 2021-07-12 15:58:34
    文章目录0 背景1 打包为so文件 0 背景 因为python是解释型语言,不能生成编译后的文件(如.o)。因此源代码的安全问题成了隐患,一半python文件编译后,为了加速运行生成的都是pyc二进制文件(容易反汇编回源代码)...

    0 背景

    因为python是解释型语言,不能生成编译后的文件(如.o)。因此源代码的安全问题成了隐患,一半python文件编译后,为了加速运行生成的都是pyc二进制文件(容易反汇编回源代码),一种更好的方法为将python源代码转换为c代码,然后编译c为so文件。尽管IDA Pro能够对so文件进行反汇编,从而将二进制代码转化为汇编语言,利用IDA Pro神奇的F5功能还能将汇编语言反编译成c/c++程序。但是反编译出来的c/c++程序却是下面这样的。无论是看懂还是得到python源代码难度都增加了不少。
    在这里插入图片描述

    一般被编译成so文件的代码都是被调用的代码,不用于直接执行。

    ⚠️注意:编译成so文件后,so文件只能在和之前用来编译的python版本相同的python版本中运行。

    1 打包为so文件

    • 0,准备:

    首先需要安装如下相关包

    python 安装:cython

    pip install cython
    

    linux 安装:python-devel,gcc

    如果是centos版linux执行:

    yum install python-devel
    yum install gcc
    

    如果是ubuntu版linux:

    apt-get install python-devel
    apt-get install gcc
    
    • 1,编写setup.py文件,内容如下:
    #!/usr/bin/env python
    # encoding = utf-8
    from distutils.core import setup
    from Cython.Build import cythonize
    setup(
      name = 'testSo.app',
      ext_modules = cythonize(["cal.py", "hello.py"])
      # ext_modules = cythonize("/Users/mac/PycharmProjects/TestSo/main.py"),
    )
    
    • 2,运行如下的指令,
    python3 setup.py build_ext --inplace
    

    得到的文件,

    在这里插入图片描述

    • 3,使用的话,直接使用import导入对应的模块,使用即可。

    例如,执行的py文件和so文件在同级目录下(其他文件可以删除),

    #!/usr/bin/env python
    # encoding=utf-8
    from hello import hello
    from sub import add
    hello("jk")
    add([1,2,3,4,5])
    

    hello.py:

    def hello(name):
     print(f"Hello {name}")
    

    sub.py:

    def add(*args):
        sum = 0
        for arg in args:
            for num in arg:
                sum += num
        print(sum)
    

    得到的结果:
    在这里插入图片描述

    如果so文件不和py文件在同一个目录下,则需要使用sys引入so的路径,然后使用。

    # 引入so文件路径
    import sys
    sys.path.append("/usr/app/spark-2.4.7-bin-hadoop2.7/Spark2/test/bigData/transform/standard")
    # 调用cal.so文件中的add方法
    from  cal import add
    add([1,2,3,4,5])
    

    2 问题

    如果遇到了,SyntaxError: Non-ASCII character '\xff' in file t.cpython-39-x86_64-linux-gnu.so on line 2, but no encoding declared;,则可以到网址解决 问题

    3 扩展(对整个文件中的python代码进行打包)

    效果:

    在这里插入图片描述

    思路:把文件夹中的代码都拷贝到结果文件中(忽略的文件中的文件就不拷贝,如果设置了非代码类配置文件就一起拷贝),然后把需要编译的文件夹路径放到list中,另外把__init__.py文件用同名的空文件替代,使用build_ext进行文件编译。

    执行的指令(用于linux环境下):

    python3 setup.py build_ext
    

    setup.py:

    import os
    import sys
    import shutil
    import numpy
    import tempfile
    
    from setuptools import setup
    from setuptools.extension import Extension
    
    from Cython.Build import cythonize
    from Cython.Distutils import build_ext
    
    import platform
    # 构建后存放的文件目录
    build_root_dir = 'build/lib.' + platform.system().lower() + '-' + platform.machine() + '-' + str(
        sys.version_info.major) + '.' + str(sys.version_info.minor)
    
    print(build_root_dir)
    
    extensions = []
    ignore_folders = ['build', 'test', 'tests']
    conf_folders = ['conf']
    
    def get_root_path(root):
        if os.path.dirname(root) in ['', '.']: # 得到文件的文件路径
            return os.path.basename(root) # 返回path最后的文件名
        else:
            return get_root_path(os.path.dirname(root))
    
    def copy_file(src, dest):
        if os.path.exists(dest): # 目的文件存在返回
            return
        if not os.path.exists(os.path.dirname(dest)): # 目的文件夹不存在,递归创建文件夹
            os.makedirs(os.path.dirname(dest))
        if os.path.isdir(src): # 判断某一路径是否为目录
            shutil.copytree(src, dest) # 拷贝整个文件夹(目的文件夹需要不存在,否则会失败)
        else:
            shutil.copyfile(src, dest) # 拷贝整个文件
    
    def touch_init_file(): # 在临时文件夹中创建init
        init_file_name = os.path.join(tempfile.mkdtemp(), '__init__.py')
        with open(init_file_name, 'w'):
            pass
        return init_file_name
    
    init_file = touch_init_file()
    print(init_file)
    
    def compose_extensions(root='.'):
        for file_ in os.listdir(root): # 当前目录下的所有文件
            abs_file = os.path.join(root, file_) # 路径拼接
            if os.path.isfile(abs_file):
                if abs_file.endswith('.py'):
                    extensions.append(Extension(get_root_path(abs_file) + '.*', [abs_file]))
                elif abs_file.endswith('.c') or abs_file.endswith('.pyc'):
                    continue
                else:
                    copy_file(abs_file, os.path.join(build_root_dir, abs_file))
                if abs_file.endswith('__init__.py'): # 用空白的__init__.py替代原有的
                    copy_file(init_file, os.path.join(build_root_dir, abs_file))
            else:
                if os.path.basename(abs_file) in ignore_folders: # 忽略的文件不拷贝
                    continue
                if os.path.basename(abs_file) in conf_folders: # 配置文件一同拷贝
                    copy_file(abs_file, os.path.join(build_root_dir, abs_file))
                compose_extensions(abs_file)
    
    compose_extensions()
    os.remove(init_file)
    
    setup(
        name='my_project',
        version='1.0',
        ext_modules=cythonize(
            extensions,
            nthreads=16,
            compiler_directives=dict(always_allow_keywords=True),
            include_path=[numpy.get_include()]),
        cmdclass=dict(build_ext=build_ext))
    
    展开全文
  • 什么是.so文件

    万次阅读 多人点赞 2021-02-09 14:23:17
    so文件是Linux下的程序函数库,即编译好的可以供其他程序使用的代码和数据 linux下何谓.so文件: 用过windows的同学应该都知道 .dll文件吧, 这二者有什么共通之处呢,其实 .so文件就跟.dll文件差不多 一般来说.so...

    so文件是Linux下的程序函数库,即编译好的可以供其他程序使用的代码和数据

    linux下何谓.so文件:

    1. 用过windows的同学应该都知道 .dll文件吧, 这二者有什么共通之处呢,其实 .so文件就跟.dll文件差不多
    2. 一般来说.so文件就是常说的动态链接库, 都是C或C++编译出来的。与Java比较就是:它通常是用的Class文件(字节码)
    3. Linux下的.so文件时不能直接运行的,一般来讲,.so文件称为共享库

    那么.so文件是怎么用的呢?for example: 

    (1) 动态库的编译
    这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。
    命令:$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so 
    参考2:都是由C或C++编译出来的 
    -shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件 
    -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。 
    (2) 动态库的链接
    这里有个程序源文件 test.c 与动态库 libtest.so 链接生成执行文件 test:
    命令:$ gcc test.c -L. -ltest -o test
    注:测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
     -L.:表示要连接的库在当前目录中 
    -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
    命令:$ ldd test
    注: 执行test,可以看到它是如何调用动态库中的函数的。

    展开全文
  • so文件

    千次阅读 2019-04-02 13:52:20
    SO文件是Linux下共享库文件,它的文件格式被称为ELF文件格式。由于Android操作系统的底层基于Linux系统,所以SO文件可以运行在Android平台上。Android系统也同样开放了C/C++接口供开发者开发Native程序。由于基于...
  • linux中的so文件

    千次阅读 2021-06-29 21:10:42
    静态链接:而动态链接在链接的时候并不将那些库文件直接拿过来,而是在运行时,发现用到某些库中的某些函数时,再从这些第三方库中读取自己所需的方法,用到什么功能,加载什么so文件,不同操作系统的动态链接库文件...
  • python调用so文件

    千次阅读 2022-03-28 16:41:34
    从文章一将各个算法整合: 文章(一)算法传送门: 如下整合的c++代码 run.cpp: 源码传输门地址: ...#define __USE_GNU #include <iostream> #include <cstdlib> #define __USE_GNU ...#include "strin
  • 安卓手机如何打开.so文件

    千次阅读 2021-05-12 12:09:27
    01安卓手机打开.so文件需要下载Native Libs Monitor这个app,这个应用可以帮助我们理解手机上安装的APK用到了哪些.so文件,以及.so文件来源于哪些函数库或者框架。我们也可以自己对app反编译来获取这些信息。so文件...
  • python 导入.so 文件

    千次阅读 2022-03-08 16:26:10
    sys.path.append(r'/Volumes/qiang/all_code/CPP-scripts/pybind11/cmake_example/tests') # 路径为存放so文件的文件夹路径 import cmake_example as m # cmake_example是so文件中的函数 def test_main(): print...
  • IDA动态调试SO文件

    千次阅读 2021-10-26 23:03:18
    IDA动态调试SO文件前言一、启动android server,以调试方式启动APK二、调试步骤三、调试技巧 前言 此篇博文仅仅记录下本人学习 IDA pro 动态调试so文件过程。 工具:IDA pro 7.5 参考博文及APK来源: ...
  • linux查看so文件的一些信息命令

    千次阅读 2021-05-11 13:58:10
    查看so文件是32位还是64位[root@n1 native]# file libhadoop.so.1.0.0libhadoop.so.1.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not strippednm用来列出目标文件的符号...
  • 解决难以打开 SO 文件的问题 打开 SO 文件过程中所遇到的常见问题GNU Compiler Collection (GCC) 消失尝试打开 SO 文件时,您收到错误 “无法打开 SO 文件类型”。 通常,这是因为你没有安装适用于 %%os%% 的 GNU ...
  • Linux下so文件的生成和使用

    千次阅读 2021-08-22 10:07:49
    so文件的时候使用C语言写,不要用C++。 2、在使用的时候,一定要保证存在头文件和.so文件。 (创建目录testso,并把myso.h和libmyso.so拷贝到testso目录下) 程序: 创建一个名字为libmyso.so的共享库文件,然后...
  • 使用IDA反编译.so文件并修改

    千次阅读 2021-05-13 10:53:10
    使用IDA反编译.so文件并修改简述之前一直在做应用层的开发很少接触底层,总感觉底层是一个很神秘的地方。最近各种原因之下有一些逆向的工作,但是好多应用的核心逻辑都是利用jni在c/c++层去实现的,这就给我们的逆向...
  • Linux下查找和安装依赖的.so文件

    千次阅读 2021-05-14 11:00:28
    以解决Webex在Linux下运行问题为例说明查找和安装依赖的.so文件方法:查找依赖的.so文件$ ldd $HOME/.webex/1324/*.so | grep 'not found'libgtk-x11-2.0.so.0 => not foundlibgdk-x11-2.0.so.0 => not ...
  • java调用so文件(详细)

    千次阅读 2022-01-05 14:12:22
    java 调用so文件 linux生成so文件
  • c++将.cpp编译为.so文件

    千次阅读 2021-03-24 14:23:30
    1.首先看文件形式 其中cpp1是直接调用.cpp和生成.so的文件夹。 cpp2是测试生成的.so可以使用的文件夹。 2.先直接编译.cpp检查代码没问题 a.cpp内容: #include <iostream> #include "a.h" void A::...
  • Android so文件理解

    千次阅读 2020-07-21 20:07:44
    一、so文件的概念 通常情况下,对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file)。程序在运行时,...
  • 使用makefile生成.so文件

    千次阅读 2021-08-04 20:07:40
    在大型的C/C++工程中,为了节省编译时间,一般都会将一些不会改动的文件生成为动态库(如.so文件),这样可以让链接过程放在运行的时候。 在工程量较少的时候可以自己写语句来生成动态库: g++ -shared -fPIC -o ...
  • 因为最近用到了so文件相关内容。所以来学习一下.so文件相关的知识,正好来写博客也当是记录并分享一些知识。 最终目的是在Unity中与so文件进行交互处理,但是本篇文章需要先对so文件有一个基本的认识。
  • 关于so文件你需要知道的知识

    千次阅读 2018-06-29 13:53:41
    1. 什么是CPU架构及ABIAndroid系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年...应用程序二进制接口(Application Binary Interface)定义了二进制文件(尤其是.so文件)如何运行在...
  • Android中so文件的生成和调用

    千次阅读 2019-01-18 11:38:16
    1、so文件介绍 “so”文件是使用C/C++编写生成的,在Android 平台上快速编译、打包该文件,它是一个动态链接库,而生成“so”文件其实就是JNI开发。 2、JNI开发简介 (1)、JNI简介 JNI全称为Java Native Interface...
  • python打包生成so文件

    千次阅读 2020-10-30 10:46:40
    python打包生成so文件 文章目录python打包生成so文件1.安装工具2. Linux下的.so文件(测试用例)3. Windows下将Python封装成pyd文件(dll) 1.安装工具 python3 安装:cython pip3 install cython -i ...
  • } 3.so文件是在插件apk中的,所以我们首先要解压so文件到data目录中。然后把路径传入到PluginJni中,就可以正常使用了。 val apkPath = context.filesDir.absolutePath + File.separator + APK_NAME val toPath = ...
  • linux 什么是SO文件

    万次阅读 多人点赞 2018-11-23 16:15:28
    牵扯到ELF格式,gcc编译选项待补,简单实用的说明一下,对Linux下的so文件有个实际性的认识。  1.so文件是什么?  2.怎么生成以及使用一个so动态库文件?  3.地址空间,以及线程安全.  4.库的初始化,解析:  5...
  • Linux下的动态链接库.so文件的使用

    千次阅读 2021-05-09 07:12:30
    1 简介大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library)。这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要按需...
  • 前言:想借助JNI和NDK的知识开发Android的串口通信,但是之前对这一部分没有了解过,以至于第一步so文件的生成和使用,就花费了两天,这里记录下配置过程。(网上有些资料也不完全对,走了很多弯路。) so文件的生成...
  • .so文件查看方法

    千次阅读 2021-03-18 18:16:26
    有些.so 文件经常提示为 打开后是一堆乱码 这时可以在vsCode中搜索Linux Binary Preview扩展插件 下载安装就可以查看了!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 813,188
精华内容 325,275
关键字:

so文件