精华内容
下载资源
问答
  • 简单实例说明如何使用Android Studio NDK编译so库

    最近项目中需要使用到NDK编译so库,控制硬件。由于不熟悉JNI和NDK,网上搜了一些方法,做个笔记备忘和分享给用需要的朋友。

    那如何用Android Studio编写JNI代码,然后生成so库呢?

    来看看一个简单的实例: 编写一个native的加法函数,然后在MainActivity中调用并显示结果。

    需要准备的事:
    1 配置好的JDK环境和Android Studio开发环境、SDK
    2 下载好NDK工具 (http://www.androiddevtools.cn/ 网站有很多Android开发需要的工具。)
    NDK版本


    1 新建Android工程

    2 添加一个类,类中包含你想用C/C++语言实现的native方法,只是声明。
    MyJni.java

    
    package com.example.hui.myjnitest ;
    
    public class MyJni {
    
        static {
            System.loadLibrary ("myjni" ) ;
        }
    
        public native int add (int a , int b) ;
    }

    其中有个静态代码块,在MyJni类加载时,执行块内代码。
    System.loadLibrary (“myjni” ) ; 程序运行时,加载库文件,在Android(Linux)中,会搜索并加载名字为libmyjni.so的文件,如果找不到,会报异常。在Windows中会搜索myjni.dll的库

    3 调用native方法

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate (Bundle savedInstanceState) {
            super .onCreate(savedInstanceState) ;
            setContentView(R.layout. activity_main );
    
            MyJni myJni = new MyJni();
            Toast. makeText( this, "1+3=" + myJni.add( 1 , 3 ) , Toast. LENGTH_LONG).show() ;
        }
    }

    MyJni myJni = new MyJni(); 获得具有native方法的类对象,然后调用该对象的方法myJni.add( 1 , 3)计算1+3的结果。

    4 编译工程
    Build–Make Project

    5 生成jni的头文件
    打开Android Studio的Terminal编辑器,一般在软件底部,如果找不到,可以按快捷键 Alt+F12 打开 (我的AS版本:2.1.1)
    Terminal
    切换到classes所在目录:
    用到的命令: cd 切换路径, dir 显示文件夹内容列表

    cd app\build\intermediates\classes\debug

    debug目录下的路径跟包名有关,比如本例中的AndroidManifest.xml中声明的包名为

    package= "com.example.hui.myjnitest"

    那本例中的”.java”文件生成的.class”就在 debug\com\example\hui\myjnitest\下 (切换到该目录下看看)

    2016/06/04  19:37               732 BuildConfig.class
    2016/06/04  19:37             1,056 MainActivity.class
    2016/06/04  19:37               454 MyJni.class
                  17 个文件         76,243 字节                                                                                                                                           
                   2 个目录 144,080,855,040 可用字节                                                                                                                                     
    E:\MyGit\MyJniTest\app\build\intermediates\classes\debug\com\example\hui\myjnitest>

    我们只用到MyJni.class文件。

    好了,了解这些后,我们应该生成头文件了。(生成头文件干嘛?后面你就知道了)


    在app\build\intermediates\classes\debug目录下执行

    javah -classpath . -jni com.example.hui.myjnitest.MyJni

    javah 用于生成头文件(*.h) (我暂时只了解这个用途)
    -classpath . 有个圆点。表示设置class路径为当前路径。如果不在debug这个路径,那这个圆点可以换成具体路径
    -jni 生成 JNI 样式的标头文件 (默认值)
    com.example.hui.myjnitest.MyJni 包名+类名,注意不要带 .java,否则会报错的。


    执行完命令,Terminal没有任何提示,在debug目录下,输入dir命令,可以看到有个 .h 文件,名字好长,其实就是把上面包名+类名中间的点换成下划线了。

    来看看这个头文件都写了什么

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_example_hui_myjnitest_MyJni */
    
    #ifndef _Included_com_example_hui_myjnitest_MyJni
    #define _Included_com_example_hui_myjnitest_MyJni
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_example_hui_myjnitest_MyJni
     * Method:    add
     * Signature: (II)I
     */
    JNIEXPORT jint JNICALL Java_com_example_hui_myjnitest_MyJni_add
      (JNIEnv *, jobject, jint, jint);
    
    #ifdef __cplusplus
    }
    #endif
    #endif

    这其中的 Java_com_example_hui_myjnitest_MyJni_add 就是我们需要实现的native方法。
    其他部分我就不多说了,可以百度一下,google一下。。。C语言的知识。

    6 新建一个名为jni的文件夹
    在工程目录app\src\main\下,新建一个jni文件夹,把上面步骤的h头文件复制到jni文件夹里。
    工程目录更新为:
    这里写图片描述
    在jni文件夹中添加一个c语言源代码文件,如myjni.c,并完成其内容。函数名从头文件中复制过来,稍作修改。(知道头文件的作用了吧)

    #include "com_example_hui_myjnitest_MyJni.h"
    
    jint JNICALL Java_com_example_hui_myjnitest_MyJni_add
      (JNIEnv *env, jobject obj , jint a , jint b)
    {
        return a+b ;
    }

    7 再次编译工程
    Build – Project
    这时 Message 窗口会提示需要设置使用当前NDK。打开gradle.properties, 在最下面粘贴上 android.useDeprecatedNdk=true

    Error:Execution failed for task ‘:app:compileDebugNdk’.

    Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set “android.useDeprecatedNdk=true” in gradle.properties to continue using the current NDK integration.

    NDK

    Build – Project
    提示没有配置NDK选项
    这里写图片描述

    8 配置NDK
    Android Studio中,菜单 File – Project Structure SDK Location 选择NDK路径
    这里写图片描述

    在build.gradle(Module:app)中完成

    android{
    defaultConfig {
         ndk {
              moduleName "xxx"   // 目标名称,不包括lib   .so
              ldLibs "xx","xx"     // jni代码中引用的库文件,本例没有引用
              abiFilters "", "", "", ""   // 生成不同平台下的so库
         }
       }
    }

    相当于一个Android.mk文件。
    这里写图片描述

    9 再次Build–Rebuild Project
    没有报错则生成了so库。这个so库路径在

    app\build\intermediates\ndk\debug\lib

    这里写图片描述这里写图片描述

    10 生成APK,用解压工具查看,apk内部有个lib文件夹,如下图所示。
    这里写图片描述

    11 在模拟器中安装并运行。
    Toast显示的是正确调用so库运行的结果。
    这里写图片描述

    代码地址:https://github.com/BrightLin/MyJniTest
    参考播客地址:http://blog.csdn.net/sodino/article/details/41946607 感谢作者 Sodino

    提示:
    如果编译时报错:需要在jni文件夹中添加一个空文件,名字为util.c

    Error:Execution failed for task ‘:app:compileDebugNdk’. > com.android.ide.common.internal.LoggedErrorException: Failed to run command: D:\Mission\adt-bundle-windows\ndk-r10b\ndk-build.cmd NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\Android.mk APP_PLATFORM=android-21 NDK_OUT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj NDK_LIBS_OUT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\lib APP_ABI=armeabi,armeabi-v7a,x86 Error Code: 2 Output: make.exe: * No rule to make target C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/JniTest/C_\Users\sodinochen\AndroidstudioProjects\JniTest2\app\src\main\jni', needed byC:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/JniTest/C_\Users\sodinochen\AndroidstudioProjects\JniTest2\app\src\main\jni\main.o’. Stop.

    展开全文
  • Linux编译如何减小so库文件的大小 今天问了我这个问题,我就顺便记录一下。客户问为什么libc.so文件再编译前和编译后的size不一样啊,staging 和 compile 两个dir下的 libc.so大小不一样,具体有什么区别吗? ...

    Linux编译时如何减小so库文件的大小

         今天问了我这个问题,我就顺便记录一下。客户问为什么libc.so文件再编译前和编译后的size不一样啊,staging 和 compile 两个dir下的 libc.so大小不一样,具体有什么区别吗?

          这是是因为编译的时候还会用strip工具来处理库文件,把二进制文件中的包含的符号表和调试信息删除掉,所以库文件编译打包后会变小。

    Strip工具是什么?

        在linux下有个工具叫做strip,这是一个可以将linux下的可执行文件的符号表去除,减少每个可执行文件的大小,这对于嵌入式方面很有必要。但是没有了符号表也就意味着没有办法采用gdb进行调试,因为gdb调试是读取ELF文件头来获取符号表,方便调试,但strip之后,可执行文件的ELF文件头就没有.symtab这个符号表,有的仅是动态符号表。在strip之后nm libxxx.so是看不到符号表的,nm -D libxxx.so可以看到动态符号表,但用处不大,但strip有个参数选项叫做--only-keep-debug,这个选项可以在strip的时候保留debug调试信息。

        strip命令如何使用,可以自行搜索一下。

    那我们再把问题拓展下:Linux编译时如何减小so动态库文件的大小

    参考https://www.cnblogs.com/yuwl26/p/13604529.html

    在一些嵌入式系统开发中,由于成本和资源的限制需要对动态库的大小进行限制,主要通过以下几种方法:

    1. 编译选项使用-Os,编译优化;

    2. 去掉-g选项,去除调试信息;

    3. 通过strip工具裁剪符号及调试信息;

    4. 只导出必要符号;Linux会默认导出所有符号,并不仅仅导出你开放的接口!

     

    C++的还可以参照这里:

    在Linux环境下编译如何减小可执行文件或者动态库的大小(C++)

    转博文:http://www.jackieathome.net/archives/777.html

    操作步骤如下:

    • 选型时,在同等功能时,尽量选择代码量少、占用空间小的开源的软件。
    • 控制C++特性的使用,如无必要,则不使用C++的高级特性。
      • 屏蔽RTTI特性,增加编译选项-fno-rtti
      • 屏蔽异常我,增加编译选项-fno-exceptions
    • 对性能影响不大时,避免使用C++的inline特性。
      • 增加编译选项-fno-inline
    • 在不影响使用时,控制对STL的组件的使用。
    • 避免使用STL的iostream的相关模板类。
    • 构建目标动态库时,控制符号的可见性。
      • 增加编译选项-fvisibility=hidden
      • 增加编译选项-fvisibility-inlines-hidden
      • 定义符号导出宏,如下代码。
        #ifndef __has_attribute
          #define __has_attribute(x) 0
        #endif
        #if (defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4) && (__GNUC_MINOR__ > 2))) || __has_attribute(visibility)
          #define MY_EXPORT     __attribute__((visibility("default")))
          #define MY_IMPORT     __attribute__((visibility("default")))
        #else
          #define MY_EXPORT
          #define MY_IMPORT
        #endif
        
        // 在外部可见的符号上,使用上述宏修饰。
        MY_EXPORT int foo(int a, int b);
        
    • 对目标以及全部依赖,使用gc-sections特性。即:
      • 编译源码时,增加选项-ffunction-sections -fdata-sections
      • 链接目标时,增加选项-Wl,--gc-sections
      • 链接目标时,增加选项-Wl,--icf=safe
    • 对目标以及全部依赖,使用LTO特性。
      • 编译源码时,增加选项-flto=full
      • 链接目标时,增加选项-flto=full
    • 构建目标时的外部依赖,均使用静态链接。比如:
      • 静态链接STL库。
      • 静态链接使用前述要求编译的依赖库。
    • 构建目标时,要求编译器对目标占用的空间进行优化。
      • 增加选项-Os
      • 假如链接失败,则修改为-O2
    • 链接时,对于Release版本,删除不必要的调试符号。
      • 增加选项-s

    如下使用CMake的请求,描述选项。

    # 关闭C++特性
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-inline")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
    
    # 控制符号的可见性
    set(CMAKE_C_FLAGS_RELEASE     "${CMAKE_C_FLAGS_RELEASE}   -fvisibility=hidden")
    set(CMAKE_CXX_FLAGS_RELEASE   "${CMAKE_CXX_FLAGS_RELEASE} -fvisibility=hidden")
    set(CMAKE_C_FLAGS_RELEASE     "${CMAKE_C_FLAGS_RELEASE}   -fvisibility-inlines-hidden")
    set(CMAKE_CXX_FLAGS_RELEASE   "${CMAKE_CXX_FLAGS_RELEASE} -fvisibility-inlines-hidden")
    
    # 删除调试符号
    set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
    
    # 开启空间优化
    if (APPLE)
      set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Oz")
      set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Oz")
    else ()
      set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Os")
      set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os")
    endif ()
    
    # 使用gc-section优化
    set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -ffunction-sections -fdata-sections")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -ffunction-sections -fdata-sections")
    set(CMAKE_EXE_LINKER_FLAGS    "${CMAKE_EXE_LINKER_FLAGS}    -Wl,--gc-sections")
    set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--gc-sections")
    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections")
    
    # 使用icf优化
    set(CMAKE_EXE_LINKER_FLAGS    "${CMAKE_EXE_LINKER_FLAGS}    -Wl,--icf=safe")
    set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--icf=safe")
    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--icf=safe")
    
    # 使用LTO
    set(CMAKE_C_FLAGS_RELEASE     "${CMAKE_C_FLAGS_RELEASE}     -flto=full")
    set(CMAKE_CXX_FLAGS_RELEASE   "${CMAKE_CXX_FLAGS_RELEASE}   -flto=full")
    set(CMAKE_EXE_LINKER_FLAGS    "${CMAKE_EXE_LINKER_FLAGS}    -flto=full")
    set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -flto=full")
    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -flto=full")

     

     

     

     

     

     

     

     

     

    展开全文
  • 编译libpq.so动态2. 不只是需要libpq-fe.h文件 1. 编译libpq.so动态     切换到libpq库函数集合目录(比如我用的PostgreSQL 13.2版本),那么该libpq目录位置为postgresql-13.2/src/interfaces/libpq位置...

    1. 编译libpq.so动态库

        切换到libpq库函数集合目录(比如我用的PostgreSQL 13.2版本),那么该libpq库目录位置为postgresql-13.2/src/interfaces/libpq位置下,如图所示:

    在这里插入图片描述

        在该目录下,直接执行:make -j命令,即可得到libpq.so动态库,如下图所示:

    在这里插入图片描述
        把libpq.so.5.13版本的动态库拷贝你的项目中,进行软连接操作。从下图可以看到,libpq.so是libpq.so.5.13的一个软连接。

    在这里插入图片描述

    2. 不只是需要libpq-fe.h文件

        在 【PostgreSQL教程】· 初识libpq库函数集合 一文中的1.2小节讲过,将libpq函数库集合应用到实际项目中,需要包含libpq-fe.h文件,其实,该文件内还包含了另外两个文件,分别是:pg_config_ext.h、postgres_ext.h。所以,你的项目实际上共需要包含3个头文件:

    在这里插入图片描述

        假如你的测试文件为a.c(假设这3个头文件和main.c位于同一级目录), 则编译命令是: gcc a.c -lpq(不需要-I参数显示指明头文件位置)。

    展开全文
  • 背景:android studio上需要使用别的同事用linux下(c++写)编译好的的so库,注意不是用c++源码放在android studio上编译; 实现原理:android studio实现JNI规范的接口,再用这套接口去调用linux下编好的so库,这个...

    背景:android studio上需要使用别的同事用linux下(c++写)编译好的的so库,注意不是用c++源码放在android studio上编译;

    实现原理:android studio实现JNI规范的接口,再用这套接口去调用linux下编好的so库,这个需要linux调用NDK中的交叉编译工具链进行交叉编译生成so库;

    步骤:

    1.NDK安装在linux环境上(ubuntu 14.04 64位系统)

    通常下载r17(包括该版本)以下的版本,因为r18以上的版本gcc/g++已被改动成clang(我也不明白怎么用)。

    在此我用的是别的网友提供的NDKhttps://dl.google.com/android/repository/android-ndk-r17-beta2-linux-x86_64.zip 下载到自建目录/opt/

    #mkdir /opt/

    #cd /opt/

    #unzip android-ndk-r17-beta2-linux-x86_64.zip //解压

    #vim /etc/profile

    在最后加上

    export NDK=/opt/android-ndk-r17-beta2
    export PATH=PATH:PATH:NDK

    保存后退出,执行

    #source /etc/profile
    检查是否安装成功:
    #ndk-build -v

    img

    2.写一个脚本build_so.sh,内容如下,把内容复制粘贴到build_so.sh即可。(脚本内容如下,我的测试代码是c++,所以用g++交叉编译工具链,如果是c代码,应该你也懂怎么改)

    其中 -I /opt/android-ndk-r17-beta2/sources/cxx-stl/stlport/stlport/ 是为了解决cpp文件中含#include 等头文件不能生成库的问题;

    #!/bin/bash

    #export NDK_GCC=/opt/android-ndk-r17-beta2/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
    export NDK_GCC=/opt/android-ndk-r17-beta2/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++

    export HO="–sysroot=/opt/android-ndk-r17-beta2/platforms/android-21/arch-arm -isystem /opt/android-ndk-r17-beta2/sysroot/usr/include -isystem /opt/android-ndk-r17-beta2/sysroot/usr/include/arm-linux-androideabi"

    export NDK_STL="-I /opt/android-ndk-r17-beta2/sources/cxx-stl/stlport/stlport /opt/android-ndk-r17-beta2/sources/cxx-stl/stlport/libs/armeabi-v7a/libstlport_static.a"

    $NDK_GCC $HO -shared -fPIC add.cpp -o libadd.so $NDK_STL

    3.在脚本的同目录,写个测试的程序add.cpp,内容如下(复制粘贴即可):

    extern “C”

    int add(int a, int b)
    {
    return (a + b);
    }
    4.执行build_so.sh即可生成libadd.so,此时libadd.so准备被android studio调用;

    =下边是android studio如何调用动态库部分===========

    5.创建带JNI功能的android studio新工程,具体参考《ubuntu下AndroidStudio快速搭建JNI》

    https://blog.csdn.net/BlackRabbit_/article/details/107788515?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160974118216780304620347%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=160974118216780304620347&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-107788515.pc_search_result_cache&utm_term=ubuntu%E4%B8%8BAndroidStudio%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BAJNI

    6.创建jniLibs目录,添加libadd.so。修改native-lib.cpp,添加add的声明以及JNI的实现,注意声明一定要放在实现前!

    img

    7.修改CMake,添加下图红框部分

    img

    8.修改MainActivity,添加红框部分

    img

    9.修改build.gradle,添加红框部分

    img

    10.正常运行后,logcat打印

    img

    参考链接:

    1.交叉编译-生成动态库在AndroidStudio中使用https://www.jianshu.com/p/5200e59ce9b9

    2.NDK在Linux下载配置以及C、C++编译配置(交叉编译)https://www.jianshu.com/p/30e040468721

    3.ubuntu下AndroidStudio快速搭建JNI https://blog.csdn.net/BlackRabbit_/article/details/107788515?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160974118216780304620347%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=160974118216780304620347&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-107788515.pc_search_result_cache&utm_term=ubuntu%E4%B8%8BAndroidStudio%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BAJNI

    展开全文
  • android如何编译出带符号表的.so库

    千次阅读 2019-03-23 18:56:09
    android如何编译出带符号表的.so库 关于这个问题,其实编译器带-g就会有调试信息。这是gcc相关的。默认其实android编译的就是带符号表的,只是在strip掉了。 例如下面的操作:/$ find . | grep libext2_e2p.so./obj/...
  • 主要介绍某个项目跟随系统一起编译如何通过makefile添加so库。   帮另外一个项目救火,需要用到百度定位的sdk,一个依赖的jar包,一个需要放到armeabi中的liblocSDK4.so库,百度lbs后台中创建访问密钥后...
  • Android Studio如何so库编译进apk中

    千次阅读 2018-03-16 14:41:14
    1.在build.gradle的android里,加上sourceSets { main { jniLibs.srcDirs = ['libs'] } }2.把so库放在libs下就可以了
  • 如何编译成.so动态

    千次阅读 2011-09-09 18:51:28
    问:我源文件为main.c, x.c, y.c, z.c,头文件为x.h,y.h,z.h ...如何编译成.so动态? 编译器用gcc 最好能给出详细参数解释,谢谢 答: # 声称动代连接,假设名称为libtest.so gcc x.c y.c z.c -fPIC
  • 如何在Qt中使用自己编译好的so库

    千次阅读 2017-11-14 14:34:24
    gcc -fPIC -shared test.o - o libtest.so二、在Qt中如何使用自己编译好的so库?1、在Qt的工程文件.pro中,添加以下代码INCLUDEPATH += /mnt/hgfs/shareFile/newTask //这个是我编译so库目录的绝对路径,里面有相关...
  • ffmpeg 编译android so库文件

    千次阅读 2018-09-01 17:41:33
    ffmpeg for android 编译so库文件 ffmpeg是现在主流播放器和直播软件中常用的库,主要用于视频的编解码,下面主要介绍一下,ffmpeg如何在android平台上使用。ffmpeg想在android上使用,一般都是在官网下载源码,...
  • 集成第三方so和jar包include $(CLEAR_VARS)#jar包编译 LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=securitysdk:libs/hello.jar#64和32系统选择不同的ifeq (arm64, $(strip $(TARGET_ARCH))) LOCAL_PREBUILT_LIBS := ...
  • 利用cmake编译安卓so库

    2020-02-17 18:02:22
    以前在安卓上编译c/c++代码,基本上都是手写makefile,用ndk-build编译,比较麻烦,后来研究了一下cmake编译安卓的so库,确实很方便,尤其是本身就有cmakelist文件的工程,省的在单独写makefile。 本文介绍如何用...
  • 花了一整天的时间,终于编译通过了。 最大的问题,就是ndk的版本和ffmpeg的版本要对应上,尝试过master,release/3.4, release/3.3, release/3.2, release/3.1,ndk-bundle, ndk-r10e各种交配,错误也是各种样式。...
  • 集成第三方so和jar包include $(CLEAR_VARS)#jar包编译LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=securitysdk:libs/hello.jar#64和32系统选择不同的ifeq (arm64, $(strip $(TARGET_ARCH)))LOCAL_PREBUILT_LIBS := ...
  • 说明:文件目录:my文件: foo.h num.cpp size.cpp name.cpp main.cpp准备文件:foo.hnum.cppsize.cppname.cppmain.cpp编译生成so文件:说明-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,031
精华内容 412
关键字:

如何编译so库