精华内容
下载资源
问答
  • libiconv安卓静态库

    2020-11-02 16:19:54
    安卓字符编码转换,以前一直使用libicuuc.so的ucnv_convert函数,但到安卓11遇到问题。改为使用开源libiconv库,ndkr14b编译,包内为头文件和各架构的静态库文件。
  • 您可以通过以下两种方式在Android Studio和Gradle中构建静态库:>使用ndk-build或gradle-experimental插件添加模块的Android.mk包括$(BUILD_STATIC_LIBRARY).>添加CMakeLists.txtadd_library(mylib STATIC...

    您可以通过以下两种方式在Android Studio和Gradle中构建静态库:

    >使用ndk-build或gradle-experimental插件添加模块的Android.mk包括$(BUILD_STATIC_LIBRARY).

    >添加CMakeLists.txt

    add_library(mylib STATIC

    source_file1.cpp

    source_file2.

    ... )

    使用Android Studio 2.3并添加模块的build.gradle

    android{

    defaultConfig{

    externalNativeBuild{

    cmake{

    \\ add cmake parameters here if you have some

    }

    }

    }

    }

    然后按Synchronize Gradle Files.但请记住,您将无法在app.apk中打包(添加)构建的静态库,因此您将无法从Java代码加载cpp代码.您只能在Android应用中加载共享库.

    展开全文
  • 通过android studio 和ndk生成Android 平台的静态库,以及使用静态库demo
  • Android.mk静态库使用方法

    千次阅读 2020-01-22 19:42:48
    静态库目录 一级目录下有Android.mk,CMakeList.txt,test.cpp以及include目录 二级目录include下有test.h 主程序目录 一级目录下有Android.mk,test_main.cpp以及二级目录lib 二级目录lib下有libtest.a和...

     

    项目树描述

    1. 静态库目录
      1. 一级目录下有Android.mk,CMakeList.txt,test.cpp以及include目录
      2. 二级目录include下有test.h
    2. 主程序目录
      1. 一级目录下有Android.mk,test_main.cpp以及二级目录lib
      2. 二级目录lib下有libtest.a和三级目录include
      3. 三级目录include下有test.h

    静态库生成和使用

    • 通过Android.mk文件生成静态库
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_SRC_FILES := test.cpp
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
    LOCAL_MODULE := test
    LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
    include $(BUILD_STATIC_LIBRARY)

    • 通过CMakeList.txt文件生成静态库
      • 交叉编译,基于NDK编译,先设置环境变量
      • # TOP变量设置需根据具体情况,这里是将工具链放在android_toolchain目录下
        export TOP=/home/user/android_toolchain
        SYSROOT=$TOP/sysroot
        export PATH=$TOP/bin:$PATH
        target_host=aarch64-linux-android
        export AR=$target_host-ar
        export AS=$target_host-clang
        export CC=$target_host-clang
        export CXX=$target_host-clang++
        
      • 然后cmake -DCMAKE_TOOLCHAIN_FILE="$TOP"/build/aos-toolchain.cmake ..(注:DCMAKE_TOOLCHAIN_FILE是配置cmake,它定义了一个文件的路径,里面set了一系列变量用于指定Target是什么平台。具体可参看https://blog.csdn.net/bytxl/article/details/50635788
      • PROJECT (test)
        set(CMAKE_CXX_FLAGS_1 "-std=c++11 -pedantic")
        set(CMAKE_CXX_FLAGS_2 "-Wno-variadic-macros -Wall -Wunused -Wunreachable-code")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_1} ${CMAKE_CXX_FLAGS_2}")
        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O2 -DNDEBUG")
        
        set(ALL_SRC_FILE test.cpp)
        include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
        message("===${CMAKE_CURRENT_SOURCE_DIR}")
        add_library(test STATIC ${ALL_SRC_FILE})
        
    • 通过Android.mk文件使用静态库(目前只能使用Android.mk文件生成的静态库,使用CMakeList.txt生成的静态库存在问题,猜测Android.mk集成预编译静态库,只能集成Android.mk文件生成的静态库 或者 是NDK版本与系统不匹配
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := test 
    LOCAL_SRC_FILES := $(LOCAL_PATH)/lib/libtest.a
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/lib/include
    include $(PREBUILT_STATIC_LIBRARY)
    $(warning "====$(LOCAL_PATH)==$(TARGET_ARCH_ABI)=")
    
    include $(CLEAR_VARS)
    LOCAL_SRC_FILES := test_main.cpp
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/lib/include
    LOCAL_STATIC_LIBRARIES := test
    LOCAL_MODULE := test_main
    LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
    include $(BUILD_EXECUTABLE)

     

    展开全文
  • Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三方 静态库 ( Android.mk ) V . 链接静态库 ( 设置静态库依赖 ) VI . Java 代码定义...



    I . Android Studio 中使用 Android.mk 配置静态库 总结



    Android Studio 中使用 Android.mk 配置第三方 静态库 :


    ① Android.mk 脚本路径设置 : 在 Module 级别的 build.gradle 脚本中配置 Android.mk 构建脚本的路径 ;

        externalNativeBuild {
            ndkBuild{
                path "src/main/ndkBuild_Static/Android.mk"
            }
        }
    

    ② 预编译第三方动态库 : 在 Android.mk 中预编译动态库 , 注意动态库与静态库使用的配置不同 , 这里以静态库举例 :

    include $(CLEAR_VARS)
    LOCAL_MODULE := add
    LOCAL_SRC_FILES := libadd.a
    include $(PREBUILT_STATIC_LIBRARY)
    

    ③ 链接动态库 : 在 Android.mk 中预链接动态库或静态库 , 注意动态库与静态库使用的配置不同 , 这里以静态库举例 :

    LOCAL_STATIC_LIBRARIES := add
    

    ④ Java 代码实现 : 声明 native 方法 , 加载编译的动态库 ; ( 虽然引入了第三方静态库 , 但是 Android 最终将该静态库打包到动态库中使用 )


    ⑤ C 代码实现 : 声明函数库中的函数 , 调用静态库中的函数 ;



    II . 第三方动态库来源



    1 . 第三方动态库源码 : add.c ;

    #include <stdio.h>
    
    int add(int a, int b){
    	return a + b;
    }
    

    2 . Ubuntu 交叉编译过程 : 参考 【Android NDK 开发】Ubuntu 函数库交叉编译 ( Android 动态库交叉编译 | Android 静态库交叉编译 ) , 最终编译出 libadd.so 动态库 , 和 libadd.a 静态库 ;



    III . 配置 Android.mk 构建脚本路径



    1 . 源码 编译 / 打包 配置 原理 : 【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 ) : I . 源码编译配置


    2 . 构建脚本路径配置 原理 : 【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 ) : II . 构建脚本配置


    3 . 这里直接设置 Android.mk 构建脚本路径 : 省略无关配置 , 只保留 NDK 相关配置 ;

    apply plugin: 'com.android.application'
    
    android {
        ...
        defaultConfig {
         	...
            // 配置 AS 工程中的 C/C++ 源文件的编译
            //     defaultConfig 内部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件编译参数
            //     defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android1.mk 构建脚本的路径
            externalNativeBuild {
                /*cmake {
                    cppFlags ""
    
                    //配置编译 C/C++ 源文件为哪几个 CPU 指令集的函数库 (arm , x86 等)
                    abiFilters "armeabi-v7a"
                }*/
                ndkBuild{
                    abiFilters "armeabi-v7a" /*, "arm64-v8a", "x86", "x86_64"*/
                }
            }
    
            //配置 APK 打包 哪些动态库
            //  示例 : 如在工程中集成了第三方库 , 其提供了 arm, x86, mips 等指令集的动态库
            //        那么为了控制打包后的应用大小, 可以选择性打包一些库 , 此处就是进行该配置
            ndk{
                // 打包生成的 APK 文件指挥包含 ARM 指令集的动态库
                abiFilters "armeabi-v7a" /*, "arm64-v8a", "x86", "x86_64"*/
            }
    
        }
    
        // 配置 NDK 的编译脚本路径
        // 编译脚本有两种 ① CMakeList.txt ② Android1.mk
        //     defaultConfig 内部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件编译参数
        //     defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android1.mk 构建脚本的路径
        externalNativeBuild {
    
            // 配置 CMake 构建脚本 CMakeLists.txt 脚本路径
            /*cmake {
                path "src/main/cpp/CMakeLists.txt"
                version "3.10.2"
            }*/
    
            // 配置 Android1.mk 构建脚本路径
            ndkBuild{
                //path "src/main/ndkBuild_Shared/Android.mk"
                path "src/main/ndkBuild_Static/Android.mk"
            }
        }
     	...
    }
    ...
    


    IV . 预编译 第三方 静态库 ( Android.mk )



    1 . 清除变量 : ( add 模块配置开始 )


    ① 作用 : 配置新的模块之前都要先清除 LOCAL_XXX 变量 ;

    ② 例外情况 : 有一个例外 , 就是不会清除 LOCAL_PATH 变量 ;

    ③ 模块开始标识 : include $(CLEAR_VARS) , 一般作为一个模块配置的起始标志 ;

    ④ 模块结尾 : include $(XXX_STATIC_LIBRARY) / include $(XXX_SHARED_LIBRARY) 一般作为模块配置结束标志 ;

    include $(CLEAR_VARS)
    

    2 . 配置静态库名称 :


    ① 自动生成函数库名称前提 : 没有 LOCAL_MODULE_FILENAME 配置 , 就会自动生成函数库名称 ;

    ② 静态库命名规则 : 在 LOCAL_MODULE 名称基础上 , 添加 lib 前缀 ( 如果前面有 lib 前缀不再添加 ) 和 .a 后缀 ;

    ③ 生成动态库名称 : libadd.a ;

    LOCAL_MODULE := add
    

    3 . 设置预编译的静态库路径 :

    LOCAL_SRC_FILES := libadd.a
    

    4 . 设置预编译静态库 : ( add 模块配置结束 )

    include $(BUILD_SHARED_LIBRARY)
    

    5 . 完整的第三方静态库预编译模块配置 :

    在这里插入图片描述

    # II . 预编译第三方静态库
    
    
    # 1 . 清除变量 ( add 模块配置开始 )
    #	① 作用 : 配置新的模块之前都要先清除 LOCAL_XXX 变量
    #	② 例外情况 : 但是不会清除 LOCAL_PATH 变量
    #	③ 模块开始 : include $(CLEAR_VARS)
    #  	④ 模块结尾 : include $(XXX_STATIC_LIBRARY) / include $(XXX_SHARED_LIBRARY)
    include $(CLEAR_VARS)
    
    # 2 . 配置动态库名称
    #	① 自动生成函数库名称前提 : 没有 LOCAL_MODULE_FILENAME 配置 , 就会自动生成函数库名称
    # 	② 动态库命名规则 : 在 LOCAL_MODULE 名称基础上 , 添加 lib 前缀 ( 如果前面有 lib 前缀不再添加 ) 和 .a 后缀
    # 	③ 生成动态库名称 : libadd.a
    LOCAL_MODULE := add
    
    # 3 . 预编译的动态库路径
    LOCAL_SRC_FILES := libadd.a
    
    # 4 . 设置预编译动态库 ( add 模块配置结束 )
    include $(PREBUILT_STATIC_LIBRARY)
    


    V . 链接静态库 ( 设置静态库依赖 )



    设置静态依赖库 :


    ① 依赖库 : 编译 native-lib 模块 , 需要链接 add 静态库 ;

    ② add 动态库 : add 模块是一个预编译库 , 预编译内容是引入的第三方动态库 ;

    # 4 . 设置静态依赖库
    #	① 依赖库 : 编译 native-lib 模块 , 需要链接 add 静态库
    #	② add 静态库 : add 模块是一个预编译库 , 预编译内容是引入的第三方静态库
    LOCAL_STATIC_LIBRARIES := add
    

    在这里插入图片描述

    # IV . 配置动态库模块
    
    
    # 1 . 清除变量 ( native-lib 模块配置开始 )
    #	① 作用 : 配置新的模块之前都要先清除 LOCAL_XXX 变量
    #	② 例外情况 : 但是不会清除 LOCAL_PATH 变量
    include $(CLEAR_VARS)
    
    
    # 2 . 配置动态库名称
    #	① 自动生成函数库名称前提 : 没有 LOCAL_MODULE_FILENAME 配置 , 就会自动生成函数库名称
    # 	② 动态库命名规则 : 在 LOCAL_MODULE 名称基础上 , 添加 lib 前缀 和 .so 后缀
    # 	③ 生成动态库名称 : libnative-lib.so
    LOCAL_MODULE := native-lib
    
    
    # 3 . 编译的源文件
    LOCAL_SRC_FILES := native-lib.c
    
    # 4 . 设置静态依赖库
    #	① 依赖库 : 编译 native-lib 模块 , 需要链接 add 静态库
    #	② add 静态库 : add 模块是一个预编译库 , 预编译内容是引入的第三方静态库
    LOCAL_STATIC_LIBRARIES := add
    
    # 5 . 链接日志库
    LOCAL_LDLIBS := -llog
    
    # 6 . 设置预编译动态库 ( native-lib 模块配置结束 )
    include $(BUILD_SHARED_LIBRARY)
    


    VI . Java 代码定义 native 方法并加载动态库



    在这里插入图片描述



    VII . C 代码调用动态库函数



    在这里插入图片描述



    VIII . 动态库 与 静态库 打包对比



    动态库打包策略 : 使用动态库 , 打包时会将所有的动态库打包入 APK 文件中 ,

    在这里插入图片描述

    静态库打包策略 : 静态库只将使用到的静态库打包入 APK 中 , 生成的库比较小 ;

    在这里插入图片描述



    IX . 配置动态库与静态库区别



    1 . 预编译时的路径不一致 :


    ① 动态库路径 : libadd.so

    ② 静态库路径 : libadd.a


    2 . 预编译时结束配置不一致 :


    ① 动态库配置 : include $(PREBUILT_SHARED_LIBRARY)

    ② 静态库配置 : include $(PREBUILT_STATIC_LIBRARY)


    3 . 链接依赖库时配置不一致 :


    ① 动态库依赖配置 : LOCAL_SHARED_LIBRARIES

    ② 静态库依赖配置 : LOCAL_STATIC_LIBRARIES



    X . 完整代码示例





    1 . build.gradle 配置示例


    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 29
        buildToolsVersion "29.0.0"
        defaultConfig {
            applicationId "kim.hsl.mk"
            minSdkVersion 15
            targetSdkVersion 29
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    
            // 配置 AS 工程中的 C/C++ 源文件的编译
            //     defaultConfig 内部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件编译参数
            //     defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android1.mk 构建脚本的路径
            externalNativeBuild {
                /*cmake {
                    cppFlags ""
    
                    //配置编译 C/C++ 源文件为哪几个 CPU 指令集的函数库 (arm , x86 等)
                    abiFilters "armeabi-v7a"
                }*/
                ndkBuild{
                    abiFilters "armeabi-v7a" /*, "arm64-v8a", "x86", "x86_64"*/
                }
            }
    
            //配置 APK 打包 哪些动态库
            //  示例 : 如在工程中集成了第三方库 , 其提供了 arm, x86, mips 等指令集的动态库
            //        那么为了控制打包后的应用大小, 可以选择性打包一些库 , 此处就是进行该配置
            ndk{
                // 打包生成的 APK 文件指挥包含 ARM 指令集的动态库
                abiFilters "armeabi-v7a" /*, "arm64-v8a", "x86", "x86_64"*/
            }
    
        }
    
        // 配置 NDK 的编译脚本路径
        // 编译脚本有两种 ① CMakeList.txt ② Android1.mk
        //     defaultConfig 内部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件编译参数
        //     defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android1.mk 构建脚本的路径
        externalNativeBuild {
    
            // 配置 CMake 构建脚本 CMakeLists.txt 脚本路径
            /*cmake {
                path "src/main/cpp/CMakeLists.txt"
                version "3.10.2"
            }*/
    
            // 配置 Android1.mk 构建脚本路径
            ndkBuild{
                //path "src/main/ndkBuild_Shared/Android.mk"
                path "src/main/ndkBuild_Static/Android.mk"
            }
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'androidx.appcompat:appcompat:1.1.0'
        implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'androidx.test:runner:1.2.0'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    }
    


    2 . Android.mk 配置示例


    # I . 保存构建脚本的路径 , 并赋值给 LOCAL_PATH 变量
    
    
    #   ① 内置函数 : my-dir 是 NDK 内置的函数 , 获取当前的目录路径
    #	在该案例中就是 Android.mk 文件所在的目录的绝对路径 , 工程根目录/app/src/main/cpp
    #	将该目录赋值给 LOCAL_PATH 变量
    #	所有的 Android1.mk 的第一行配置都是该语句
    
    LOCAL_PATH := $(call my-dir)
    
    
    
    # II . 预编译第三方静态库
    
    
    # 1 . 清除变量 ( add 模块配置开始 )
    #	① 作用 : 配置新的模块之前都要先清除 LOCAL_XXX 变量
    #	② 例外情况 : 但是不会清除 LOCAL_PATH 变量
    #	③ 模块开始 : include $(CLEAR_VARS)
    #  	④ 模块结尾 : include $(XXX_STATIC_LIBRARY) / include $(XXX_SHARED_LIBRARY)
    include $(CLEAR_VARS)
    
    # 2 . 配置动态库名称
    #	① 自动生成函数库名称前提 : 没有 LOCAL_MODULE_FILENAME 配置 , 就会自动生成函数库名称
    # 	② 动态库命名规则 : 在 LOCAL_MODULE 名称基础上 , 添加 lib 前缀 ( 如果前面有 lib 前缀不再添加 ) 和 .a 后缀
    # 	③ 生成动态库名称 : libadd.a
    LOCAL_MODULE := add
    
    # 3 . 预编译的动态库路径
    LOCAL_SRC_FILES := libadd.a
    
    # 4 . 设置预编译动态库 ( add 模块配置结束 )
    include $(PREBUILT_STATIC_LIBRARY)
    
    
    
    # III . 打印变量值
    
    
    # 打印 LOCAL_PATH 值
    # Build 打印内容 : LOCAL_PATH : Y:/002_WorkSpace/001_AS/005_NDK_Compile/app/src/main/cpp
    # 编译 APK 时会在 Build 中打印
    $(info LOCAL_PATH : $(LOCAL_PATH))
    
    
    
    # IV . 配置动态库模块
    
    
    # 1 . 清除变量 ( native-lib 模块配置开始 )
    #	① 作用 : 配置新的模块之前都要先清除 LOCAL_XXX 变量
    #	② 例外情况 : 但是不会清除 LOCAL_PATH 变量
    include $(CLEAR_VARS)
    
    
    # 2 . 配置动态库名称
    #	① 自动生成函数库名称前提 : 没有 LOCAL_MODULE_FILENAME 配置 , 就会自动生成函数库名称
    # 	② 动态库命名规则 : 在 LOCAL_MODULE 名称基础上 , 添加 lib 前缀 和 .so 后缀
    # 	③ 生成动态库名称 : libnative-lib.so
    LOCAL_MODULE := native-lib
    
    
    # 3 . 编译的源文件
    LOCAL_SRC_FILES := native-lib.c
    
    # 4 . 设置静态依赖库
    #	① 依赖库 : 编译 native-lib 模块 , 需要链接 add 静态库
    #	② add 静态库 : add 模块是一个预编译库 , 预编译内容是引入的第三方动态库
    LOCAL_STATIC_LIBRARIES := add
    
    # 5 . 链接日志库
    LOCAL_LDLIBS := -llog
    
    # 6 . 设置预编译动态库 ( native-lib 模块配置结束 )
    include $(BUILD_SHARED_LIBRARY)
    
    
    
    # V . 配置动态库与静态库区别
    
    
    #	1 . 预编译时的路径不一致 :
    #		① 动态库路径 : libadd.so
    #		② 静态库路径 : libadd.a
    
    #	2 . 预编译时结束配置不一致 :
    #		① 动态库配置 : include $(PREBUILT_SHARED_LIBRARY)
    #		② 静态库配置 : include $(PREBUILT_STATIC_LIBRARY)
    
    #	3 . 链接依赖库时配置不一致 :
    #		① 动态库依赖配置 : LOCAL_SHARED_LIBRARIES
    #		② 静态库依赖配置 : LOCAL_STATIC_LIBRARIES
    


    3 . Java 代码示例


    package kim.hsl.mk;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
        static {
    
            // 1 . 加载动态库的情况 : ( 必须不能注释下面的代码 )
            //      ① 6.0 以下的版本 : 需要手动加载依赖库 libadd.so
            //      ② 6.0 以上的版本 : 无法使用 Android.mk 构建脚本加载第三方动态库
            //                         此情况下, 无论是否手动加载 libadd.so 都会报错
            //
            // 2 . 加载静态库的情况 : ( 必须注释掉下面的这行代码 )
            //System.loadLibrary("add");
    
            System.loadLibrary("native-lib");
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            TextView tv = findViewById(R.id.sample_text);
            tv.setText(stringFromJNI());
        }
    
        public native String stringFromJNI();
    }
    
    


    4 . C 代码示例


    #include <jni.h>
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #include <android/log.h>
    
    
    //调用 libadd.so 动态库中的方法
    extern int add(int a, int b);
    
    JNIEXPORT jstring JNICALL
    Java_kim_hsl_mk_MainActivity_stringFromJNI(
            JNIEnv *env,
            jobject obj) {
    
        //调用动态库中的函数
        int sum = add(1, 2);
    
        // Logcat 打印计算结果
        __android_log_print(ANDROID_LOG_INFO, "JNI_TAG", "Native Caculate : %d + %d = %d", 1, 2, sum);
    
        //将加法运算转为字符串
        char str[50] = "0";
        //字符串格式化
        sprintf(str, "Native Caculate : Static Library : %d + %d = %d", 1, 2, sum);
    
        return (*env)->NewStringUTF(env, str);
    }
    
    


    5 . 运行结果 ( Android 7.0 手机 )


    在这里插入图片描述



    XI . 博客资源



    CSDN 博客地址 : 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )

    博客资源下载地址 : https://download.csdn.net/download/han1202012/12157595

    示例代码 GitHub 地址 : https://github.com/han1202012/007_NDK_Android_mk_Static

    展开全文
  • ffmpeg 3.1 android 静态库及动态库
  • 静态库使用另一个静态库

    千次阅读 2020-04-15 14:16:04
    静态库使用 一、来由-决定思路 1、近期调试一个模块源码编译调用另一个静态库(B.a),最后生成静态库(C.a),最后用最终生成的静态库(C.a)编译出可执行文件的时候,提示报错了:在静态库(C.a)中,对‘fun’...

    静态库使用

    一、来由-决定思路

    1、近期调试一个模块源码编译调用另一个静态库(B.a),最后生成静态库(C.a),最后用最终生成的静态库(C.a)编译出可执行文件的时候,提示报错了:在静态库(C.a)中,对‘fun’未定义的引用,很郁闷啊。
    2、但是整成动态库,就不存在这个问题,为此检查了几遍CMakeList.txt文件,还是没能调出来。
    3、最后就秉着你所遇到的问题,大多数已经被别人解决了原则,果然这个原则十分有用,问题很快的被找到了。

    二、库的使用原理

    1、静态库是目标文件的集合,通常为后缀为.o 的文件,编译静态库时只有编译过程,没有链接过程,静态库引用其它库并不会在编译的时候把引用的库函数编译到生成的目标库中,只是将编译后的中间文件打包。
    2、在创建可执行程序的过程中,静态库同时被链接到程序代码,被主程序调用的函数目标文件连同主程序组合成单一的可执行程序。静态库只在程序链接时起作用,最终的执行程序脱离静态库运行。

    三、合并静态库

    1、倘若你遇到这种情况了,你还是想使用静态库,可以将两个合起来,先前说了静态库是目标文件的集合,当然了你也就可以获取到对应的目标文件,最后将这些目标文件统一为一个集合,也就是最终要使用的静态库。
    在linux下执行命令:

     ar x A.a
     ar x B.a
     ar rc C.a *.o
    

    这样最后就生成了你所需要的C.a了。

    展开全文
  • android librtmp静态库

    2018-12-09 21:24:48
    android librtmp静态库
  • Android Studio 中 CMake 引入静态库流程 III . 指定 CMake 最小版本号 IV . 导入函数库 ( 静态库 / 动态库 ) 编译配置 V . 导入第三方函数库路径配置 VI . 输出日志信息 VII . 链接函数库 VIII . Module 级别的 ...
  • Android mk方式使用动态库和静态库

    千次阅读 2020-03-31 22:00:25
    centos ndk下载和编译动态库 静态库 Mac使用iTerm2 rz sz和腾讯云互传文件 将libget.a 和 libget.so 添加到ndkdir目录中,并创建Android.mk文件 配置build.gradle externalNativeBuild { ndkBuild { abiFilters...
  • Android中通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态链接库和动态链接库两种,是在链接的时候才会用到的库,只有C/C++、OC语言才会有链接过程,Java没有。 静态库在程序编译时会被连接到...
  • android平台ffmpeg编译静态库正常,app使用编译好的静态库时报错: libavcodec/ffv1enc.c:476: error: undefined reference to 'log2' libavcodec/ffv1enc.c:476: error: undefined reference to 'log2' ...
  • 本文将介绍CMake和Android mk两种方式使用静态库。 主要内容 CMake Android mk CMake CMake方式构建使用比较简单,创建的一个新的支持Native C++的工程默认使用此方式。 设置包名等信息,点Finish完成 将编译好...
  • 静态库好比一个压缩包,使用ar x libxxx.a可将里面的.o文件还原 ar x libxxx.a 使用ar rc libtarget.a a.o b.o c.o xxx.o可将多个.o打包为一个.a ar rc libtarget.a *.o 如果是使用交叉编译的库,需要把ar工具...
  • Android 使用FFmpeg静态库

    千次阅读 2019-05-31 14:36:53
    FFmpeg 编译生成.a 静态库 译环境: Linux 环境(Ubuntu 14.04 ,x86_64) NDK 版本(android-ndk-r17c) FFmpeg 版本(ffmpeg-4.0.1): 编写编译脚本: #!/bin/bash NDK_ROOT=/root/ndk/android-ndk-r17c #TOOLCHAIN...
  • 题外话,在Android.mk/Android.bp当中,如果是静态库没有循环依赖,如果只是B依赖于C,那么 static_libs { “B”, “C” } 应该将被依赖的库放到后面,编译不会有问题 说回循环依赖的问题,参考stackoverflow的方法 ...
  • Android boost 1.69静态库

    2019-09-23 16:22:51
    Android平台C++ BOOST v1.69静态库,欢迎大家下载使用
  • 注:比较适用于将第三方开源库编译成静态库,也可以将自己写的源码编译成静态库,给自己或其他人的底层调用。 本文目录: 1.开发环境配置 2.编译静态库方法 3.调用静态库方法 4.示例 1.开发环境配置 环境...
  • 代码放在一些静态库中,这些库应该链接在一起.我在网上发现了很多关于这个主题的问题和答案,其中大多数建议将我的库放到Android.mk文件中的LOCAL_STATIC_LIBRARIES.但是,如果我这样做,我发现LOCAL_STATIC_LIBRARIES的...
  • android导入静态库

    2018-11-08 18:01:19
    待导入静态库的 LOCAL_MODULE是itest_static LOCAL_MODULE_FILENAME是itest 导入方式如下图:
  • 情况一:编译静态库 情况二:编译动态库 情况三:编译动态库+静态库 情况四:已有第三方静态库(动态库),编译静态库(动态库) 默认所有代码和文件在$project/jni下,否则特殊说明。 情况一:编译静态库 ...
  • android 静态库 依赖问题

    千次阅读 2015-07-17 18:13:58
    静态库依赖与静态库,依赖的库要放后面
  • 有个android手机项目,linux3.10,kernel里面有几个文件不想开源出去,想做成静态库一起发布给客户 请问一下怎么将这几个文件做成静态库,做出来后放在哪个目录,再编译整个kernel的时候.mk文件该怎么写 希望能...
  • 当前有一个C++项目的源码,需要根据这个C++项目的源码生成Android平台下的静态库. 生成的静态库需要依赖第三方的静态库.a. 准备工作 生成第三方库(被依赖的库),以下以一个简单的pro1工程为例,根据以下pro1的源码以及...
  • android 静态库和动态库编译

    千次阅读 2017-01-21 14:20:25
    android 库的编译依赖于nkd-build,使用之前请先安装NDK。...Android.mk(同时编译静态库和动态库):LOCAL_PATH := $(call my-dir)$(info ) $(info ****** Build Library ******)##############################
  • 目前我在做HM(HEVC测试软件)移植到Android平台,在移植过程中出现了一些问题,顺便记录下来,供大家分享。也让大家在出现问题是能够有一个参照。这些天忙着调试程序中出现的BUG,没有来得及更新。 移植HM详细请...
  • I . Ubuntu 中交叉编译 Android 动态库 II . Ubuntu 中交叉编译 Android 静态库
  • android静态库链接顺序问题

    千次阅读 2015-08-27 10:57:52
    静态库链接问题 最近做的andriod项目中遇到了一个奇怪的bug,怀疑到了init进程内存越界,所以想用efence进行检查。 但是有个问题,以前用efence,都是用的动态库,而init中...静态库静态库呗,反正原来已经使用
  • 介绍Android开发中NDK 编译和使用静态库、动态库的方法。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 71,236
精华内容 28,494
关键字:

安卓静态库使用