精华内容
下载资源
问答
  • 2022-02-25 14:59:38

    conan Windows下Android NDK交叉编译Boost

    Conan 是 C 和 C++ 语言的依赖项和包管理器。它是免费和开源的,适用于所有平台(Windows、Linux、OSX、FreeBSD、Solaris 等),可用于开发所有目标,包括嵌入式、移动(iOS、Android)和裸机。它还与 CMake、Visual Studio (MSBuild)、Makefiles、SCons 等所有构建系统集成,包括专有系统。
    它专为加速 C 和 C++ 项目的开发和持续集成而设计和优化。通过完整的二进制包管理,它可以为任意数量的不同版本的包创建和重用任意数量的不同二进制文件(用于不同的配置,如架构、编译器版本等),在所有平台上使用完全相同的过程。由于它是去中心化的,因此很容易运行自己的服务器来私下托管自己的包和二进制文件,而无需共享它们。@《Conan官方文档》

    上一篇博客《conan入门(九):NDK交叉编译自己的conan包项目塈profile的定义》中我们以jsonlib为例说明了如何NDK交叉编译自己封装成conan的模块及定义profile简化编译的方式。

    本文在此基础上说明Windows下如何使用conan实现Android NDK交叉编译经常用到的的Boost库。

    一般来说编译Boost库是比较复杂的,因为它本身还需要别的依赖库(b2,bzip2,libbacktrace,libiconv,msys2,zlib),还要配置一大堆参数,编译时间也较长,以前每次编译Boost库都感觉是个很麻烦的任务,需要高度集中注意力,一不小心搞错了,就要重新来过,浪费很多时间。

    这次Android NDK交叉编译Boost库,才真正体现了conan的好处,定义好profiile后,只需要执行conan install就可以完成交叉编译过程,缺少的依赖库会自动被编译,真是很方便。

    系统环境

    conan https://conan.io

    python3 https://www.python.org

    android-ndk-r19c NDK 下载

    profile

    与上一篇博客《conan入门(九):NDK交叉编译自己的conan包项目塈profile的定义》中的android_21_arm_clang略有不同:

    • 并且[options]增加了addr2line_location定义,否则交叉编译boost的时候会报错:

      addr2line_location must be an absolute path to addr2line

      addr2line_location是boost conan配置文件(参见 boost/all/conanfile.py)定义的的选项,默认值为/usr/bin/addr2line,在Linux下不指定这个参数没问题,但在默认值显然不适合Windows平台,所以必须指定。

    • ndroid_ndkCONAN_CMAKE_TOOLCHAIN_FILE在定义路径时改为使用Windows下标准的路径分割符\(如果是在Linux下执行要用/做路径分割符)。

    在编译其他项目时用不到addr2line_location,如果有它反而会报错,所以考虑到profile的复用性,要在addr2line_location定义前加boost:前缀,指定只用于boost编译.

    因为armv7与armv8的编译参数有挺大的不同,所以这里我们分成两个profile来定义

    android_armv8_clang

    include(default)
    # 需要修改为你的Android NDK实际安装位置
    android_ndk=C:\android-ndk-r19c
    target_host=aarch64-linux-android
    api_level=21
    [settings]
    arch=armv8
    build_type=Release
    compiler=clang
    compiler.libcxx=c++_static
    compiler.version=8
    os=Android
    os.api_level=$api_level
    #[tool_requires]
    [options]
    # linux下不需要此定义
    boost:addr2line_location=$android_ndk\toolchains\llvm\prebuilt\windows-x86_64\bin\x86_64-linux-android-addr2line.exe
    [env]
    PATH=[$android_ndk\toolchains\llvm\prebuilt\windows-x86_64\bin]
    CHOST=$target_host
    AR=$target_host-ar
    AS=$target_host-as
    RANLIB=$target_host-ranlib
    # Windows下必须有.cmd文件后缀
    CC=$target_host$api_level-clang.cmd
    CXX=$target_host$api_level-clang++.cmd
    LD=$target_host-ld
    STRIP=$target_host-strip
    # linux下不需要此定义
    CONAN_CMAKE_GENERATOR="Unix Makefiles"
    [conf]
    tools.android:ndk_path=$android_ndk
    

    这个profile文件你可以保存在任何位置,但建议保存在Conan专门保存profile文件的文件夹下$HOME/.conan/profiles

    android_armv7a_clang

    include(default)
    android_ndk=D:\j\android-ndk-r19c
    target_host=armv7a-linux-androideabi
    api_level=16
    [settings]
    arch=armv7
    build_type=Release
    compiler=clang
    compiler.libcxx=c++_static
    compiler.version=8
    os=Android
    os.api_level=$api_level
    #[tool_requires]
    [options]
    boost:addr2line_location=$android_ndk\toolchains\llvm\prebuilt\windows-x86_64\bin\x86_64-linux-android-addr2line.exe
    [env]
    PATH=[$android_ndk\toolchains\llvm\prebuilt\windows-x86_64\bin]
    CHOST=$target_host
    # see also https://developer.android.com/ndk/guides/other_build_systems
    AR=arm-linux-androideabi-ar
    AS=arm-linux-androideabi-as
    RANLIB=arm-linux-androideabi-ranlib
    CC=$target_host$api_level-clang.cmd
    CXX=$target_host$api_level-clang++.cmd
    LD=arm-linux-androideabi-ld
    STRIP=arm-linux-androideabi-strip
    [conf]
    tools.android:ndk_path=$android_ndk
    

    与android_21_armv8_clang相比针对armv7定义的profile在定义AR,AS,RANLIB,LD,STRIP环境变量时并没有使用$target_host-XX的格式,因为对armv7的ar,as,ranlib,ld,strip程序的文件名定义规则与armv8i不同,所以不存在armv7a-linux-androideabi-ar的程序,参见Android官方文档《将 NDK 与其他构建系统配合使用》中下面的说明:

    注意:对于 32 位 ARM,编译器会使用前缀 armv7a-linux-androideabi,但 binutils 工具会使用前缀 arm-linux-androideabi。对于其他架构,所有工具的前缀都相同

    conan install(交叉编译)

    创建了profile后,编译Boost就比较简单

    # 编译conan包复制到本地仓库。
    $ conan install boost/1.69.0@ -pr:h android_armv7a_clang -pr:b default --build missing  -o without_stacktrace=True
    

    -pr:h android_armv7a_clang 指定目标设备的profile交叉编译配置文件,如果配置文件不在Conan专门保存profile文件的文件夹$HOME/.conan/profiles下,需要准确指定路径

    -pr:b default 指定使用名为default的profile文件作为当前主机的配置文件[这个参数不是必须的]

    –build missing 如果依赖包中没有找到预编译的二进制包则从源码编译

    conan install 命令行用法详细说明参见Conan官方文档《conan install》

    -o without_stacktrace=True 指定不编译 stacktrace 库,不知道为什么conan NDK交叉编译时不会编译stacktrace,而且会导致编译结束后报错,需要分析boost的conanfile.py脚本才能找到原因.

    conan install执行成功后,就会将生成的二进制包保存在本地仓库$HOME/.conan/data/boost/1.69.0/_/_package

    执行conan search boost/1.69.0@会显示二进制包的信息

    在这里插入图片描述

    conan upload(上传到私有制品库)

    项目编译成功就可以上执行conan upload传到私有制品库了:

    conan upload boost/1.69.0  -r ${repo} --all
    # ${repo}为私有制品库的名字
    

    –all 指定上传所有内容(配置文件conanfile.py,源码和二进制包),如果不指定些选项,只上传除二进制包之外的所有文件

    关于 conan upload命令的详细说明参见Conan官方文档:《conan upload》

    上传成功进入JFrog Artifactory后台就可以看到已经上传的package
    在这里插入图片描述

    总结

    上面一套流程做完,可以总结一下将一个conan执行Android NDK交叉编译的Boost的过程:

    开始麻烦些,需要准备profile(可复用),后面就很简单 :

    conan install 完成交叉编译

    conan upload 负责 conan包的上传发布

    参考资料

    《conan install》

    《conan upload》

    《将 NDK 与其他构建系统配合使用》

    conan系列文章

    《conan入门(一):conan 及 JFrog Artifactory 安装》
    《conan入门(二):conan 服务配置-密码管理及策略》
    《conan入门(三):上传预编译的库(artifact)》
    《conan入门(四):conan 引用第三方库示例》
    《conan入门(五):conan 交叉编译引用第三方库示例》
    《conan入门(六):conanfile.txt conanfile.py的区别》
    《conan入门(七):将自己的项目生成conan包》
    《conan入门(八):交叉编译自己的conan包项目》
    《conan入门(九):NDK交叉编译自己的conan包项目塈profile的定义》
    《conan入门(十):Windows下Android NDK交叉编译Boost》
    《conan入门(十一):Linux下Android NDK交叉编译Boost》
    《conan入门(十二):Windows NDK 编译 boost报错:CMake was unable to find a build program … MinGW Makefile》
    《conan入门(十三):conan info 命令的基本用法》
    《conan入门(十四):conan new 命令的新特性–模板功能(–template)》
    《conan入门(十五):AttributeError: ‘CMake‘ object has no attribute ‘definitions‘》
    《conan入门(十六):profile template功能实现不同平台下profile的统一》
    《conan入门(十七):支持android NDK (armv7,armv8,x86,x86_64)交叉编译的统一profile jinja2模板》
    《conan入门(十八):Cannot recognize the Windows subsystem, install MSYS2/cygwin or specify a build_require》
    《conan入门(十九):封装第三方开源库cpp_redis示例》
    《conan入门(二十):封装只包含头文件(header_only)的库示例》
    《conan入门(二十一):解决MinGW编译Openssl的编译错误:crypto/dso/dso_win32.c》
    《conan入门(二十二):编译 openssl要求python 3.7以上版本》
    《conan入门(二十三):Windows下MinGW编译libcurl》
    《conan入门(二十四):通过CONAN_DISABLE_CHECK_COMPILER禁用编译器检查》
    《conan入门(二十五):imports将包安装到本地项目或其他指定位置》

    更多相关内容
  • android NDK模块开发详细教程
  • Android NDK r19

    2020-09-10 10:26:54
    Android NDK r19版本适用于unity2020.1.3,里面含有两个小版本,都可以试一下肯定有一款可以使用。感谢大家支持!
  • 1、支持arm 2、支持aarch64
  • Android jni文件读写 NDK文件读取 读写 操作 NDK数据加密DEMO 源码直接上传,运行在android6.0系统测试通过
  • 博客名称 : 【Android NDK 开发】在 C 代码中获取 Android 系统信息 ( NDK 项目创建 | NDK 配置 | 获取 Android 系统版本号 ) 博客地址 : https://hanshuliang.blog.csdn.net/article/details/102933704
  • ubuntu下android ndk编译环境搭建,android应用程序开发,环境编译
  • Android NDK

    2013-04-09 17:17:39
    Android NDK 安装以及 HelloWorld!测试
  • 下载 https://developer.android.google.cn/ndk/downloads/ https://developer.android.google.cn/ndk/downloads/older_releases 编译ffmpeg:最高版本16b,再高的版本...export NDK=/home/quantum6/android-ndk-16b
  • Mac 下配置Android NDK 环境变量[附带网盘NDK下载]-附件资源
  • Android NDK 开发教程 - v1.0》
  • Android Ndk: 如何从native层直接获取 assets文件夹下的文件-附件资源
  • 需要在系统源码下编译,或者提取出对应的头文件亦可。这里需要注意Android4.x以后系统SeLinux如果打开,系统级需要配置对应的sepolicy才能使用。测试阶段推荐直接setenforce 0关闭鉴权即可
  • Android NDK编程

    千次阅读 2022-01-24 16:35:47
    NDK简介 使用命令进行NDK开发 使用Android Studio进行NDK开发 NDK安装包

    一、NDK简介

    1.1 什么是NDK

            NDK是一系列工具的集合,全称为Android Native Development Kit,用于帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的;

    1.2 为什么使用NDK

            1. 方便不同平台之间的代码移植;
            2. 方便进行库的重复使用;
            3. 在某些情况下提性能,特别是像游戏这种计算密集型应用;
            4. 使用第三方库,现在许多第三方库都是由C/C++库编写的,比如Ffmpeg这样库;
            5. 不依赖于Dalvik Java虚拟机的设计;
            6. 代码的保护,由于APK的Java层代码很容易被反编译,而C/C++库反编译难度大;

    1.3 JNI和NDK的关系

    1.3.1 简述

            JNI负责Java与C/C++进行互相操作,NDK提供工具方便在Android平台使用JNI;

    1.3.2 详解

            JNI提供一些列的接口,允许Java类与C/C++等本地编辑语言(在JNI中,这些语言被称为 本地语言)编写的应用 程序、模块 、库进行交互操作。比如,在Java类中使用C语言库中的函数或在C语言中使用 Java类库,都需要借助JNI;

            Android NDK是一个开发工具集,提供一系列工具快速开发C/C++的动态库,并能自动将 .so/.dll 和 Java 应用一起打包到Apk;NDK提供工具可以方便JNI调用C/C++,而且提供了交叉编译器可以修改.mk文件生成特定CPU平台的动态库,并能将so和java应用一起打包到apk中;

    二、NDK开发实例-使用命令

    2.1 NDK开发包

            接下来以Ubuntu虚拟机为平台,介绍如何安装NDK开发环境; 

    2.1.1 NDK开发包下载

            下载地址:NDK 下载  |  Android NDK  |  Android Developers

             下载完后解压

    2.1.2 加入环境变量

            1. 打开终端,在当前home目录下执行 sudo gedit .bashrc,在打开的文件的最后位置输入如下内容,并保存退出;

    # set NDK env
    NDKROOT=/media/zhuziwen/code/Myfile/NDK/android-ndk-r23b-linux
    export PATH=$NDKROOT:$PATH

            2. 执行 source .bashrc,使配置的环境变量生效;

    2.2 NDK开发步骤

            接下来将讲述如何通过NDK完成C语言动态链接库的生成,再通过JNI来调用该动态库返回运算结果;

            主要工作是:编写Java代码,使用native声明需要本地实现的方法add;通过javah -jni命令生成带有JNI样式的头文件;使用C代码实现该函数并编写相应的编译规则文件Android.mk;最后由ndk-build命令生成动态链接库,并将其打包到应用程序。接下来将描述具体步骤:

    2.2.1 编写Java源代码 

            源代码功能:定义整型a作为保存AddNum反馈的结果,并最终显示在TextView上;

            1. 代码第16行的add方法在使用NDK开发的.so动态链接库中完成;

            2. Java源代码中native声明add为本地方法,比如使用C/C++实现;

            3. 一般使用static块加载动态库,该块中使用System.loadLibrary()加载库,myjni为动态库的名字;

            Java代码如下:

            1. com.android.ndkdemo.MainActivity.java

    package com.android.ndkdemo;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
        TextView tv1;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            int a = add(5,4);	//需要相加的两个数字
            tv1 = findViewById(R.id.tv);
            tv1.setText("a = " + a);	//在屏幕上显示a的结果
        }
    
        public native int add(int a, int b);
        static
        {
            //装载lib*.so文件
            System.loadLibrary("NativeAdd");
        }
    
    }

    2.2.2 生成Java头文件

            1. 拷贝 jni.h 头文件

            (1)生成头文件之前,需要从Linux系统安装的JDK目录下将 jni.h 文件拷贝到当前NDK根目录;

            (2)先要查找Linux系统当前安装的JDK目录,查找方法参考如下文章;

            查找JDK目录:在linux中查看jdk的版本以及安装路径-CSDN博客

            (3)在你的JDK目录的include目录下有一个jni.h的文件,将其复制到NDK根目录下即可;

            2. 生成 com_android_ndkdemo_MainActivity.h 头文件

            进入NDK根目录下,输入命令javah -jni com.android.ndkdemo.MainActivity,生成JNI样式的头文件,即com_addnum_AddNum.h,该文件中含有JNI函数的声明(这里属于静态注册);

            com_android_ndkdemo_MainActivity.h代码内容如下:

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

    注意点:

            (1)生成JNI头文件后,记得把其中的 #include <jni.h> 改成 #include "jni.h",因为我们使用的是当前目录下的 jni.h 头文件,并不是配置好的环境变量目录下的 jni.h 文件;

            jint JNICALL Java_com_android_ndkdemo_MainActivity_add  (JNIEnv *, jobject, jint, jint)即是本地方法中需要实现的方法,需要保持方法名一致,否则将导致错误。native对应的函数名要以Java_开头,后面分别跟着com_android_ndkdemo(包名)、MainActivity(类名)、add(函数名)。

            关于JNI基本原理和函数结构,见博客:https://blog.csdn.net/qq_41739313/article/details/121947136

    2.2.3 编写C代码和Android.mk

            (1)在根目录下(即NDK目录)编写C代码AddNum.c,直接通过return a+b实现加法功能;

    #include "com_android_ndkdemo_MainActivity.h"
    
    JNIEXPORT jint JNICALL Java_com_android_ndkdemo_MainActivity_add(JNIEnv *env, jobject thiz, jint a, jint b)
    {
        return a + b;
    }

            (2)编写Android.mk,代码如下:

    LOCAL_PATH := $(call my-dir)	# 获取当前路径,并保存在LOCAL_PATH中
    
    NDK_PROJECT_PATH := .
    include $(CLEAR_VARS)		# 由编译系统提供,GNU MAKEFILE清除LOCAL_XXX变量,除了LOCAL_PATH以外
    LOCAL_MODULE := NativeAdd	# 指定编译出的库名
    LOCAL_SRC_FILES := AddNum.c	# 指定编译源文件
    include $(BUILD_SHARED_LIBRARY) # 指定编译成动态链接库,BUILD_STATIC_LIBRARY为静态库

    说明:

            参考:Android.mk 用法解析2_09的专栏-CSDN博客_call my-dir

    2.2.4 编写Application.mk

            (1)在NDK根目录下创建Application.mk文件,内容如下:

    APP_BUILD_SCRIPT := Android.mk	# 指明用于构建Android项目的mk文件的位置
    APP_PLATFORM := android-17	    # 设置使用的ndk版本,使其与本地下载的ndk版本保持一致
    APP_ALLOW_MISSING_DEPS := true	# 与APP_PLATFORM := android-17一起起作用

    注意点:

            不加Application.mk会出现如下报错 :

            (1)不加APP_BUILD_SCRIPT := Android.mk,会导致找不到Android.mk,具体报错信息如下:

    Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: ./jni/Android.mk    
    /media/zhuziwen/code/Myfile/NDK/android-ndk-r23b-linux/android-ndk-r23b/build/core/add-application.mk:88: *** Android NDK: Aborting...    .  Stop.

            (2)不加 APP_PLATFORM 和 APP_ALLOW_MISSING_DEPS ,会出现如下报错:

    Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-16. 

    2.2.5 生成动态链接库

            在终端,进入NDK根目录,输入 ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk 命令,即可生成动态链接库,该命令执行过程中,会根据Android.mk中规定的编译规则将AddNum.c编译成libNativeAdd.so。

            如果编译成功,会在NDK根目录下生成libs和obj目录,在libs目录中有几个子目录,每个子目录对应一个平台,在其中都有一个libNativeAdd.so的动态链接库文件,将其复制到NDK根目录下;

    2.2.6 运行测试

            打开AVD模拟器或者把apk安装到手机上,就可以看到通过调用本地方法实现加法功能,输出结果正确;​

    三、 NDK开发实例-使用AS

            本节主要讲解在Linux环境下如何使用ndk-build构建工具来进行NDK开发,以及ndk-build构建工具在Android Stuido中的快捷工具配置。

            关于其中涉及到的JNI的相关知识与原理,见博客:https://blog.csdn.net/qq_41739313/article/details/121947136

    3.1 安装NDK工具包

            在SDK Tools中安装NDK开发环境(File > Settings > Appearance & Behavior > System Settings > Android SDK > SDK Tools):

    3.2 新建NDK项目

            (1)正常新建一个Android空项目;

            (2)进入project显示模式,在src -> main下创建文件夹jni,用于编写原生代码;

                            

    3.3 快捷键配置

            在Android Studio中,可以将 javah -jni 命令和 ndk-build 命令配置成快捷键,博主未配置成功,感兴趣的同学可以参考Android NDK开发(二) 使用ndk-build构建工具进行NDK开发 - 简书

            本文采取直接在Android Studio界面下方的Terminal中执行相关命令的方式,见后文;

    3.4 创建Java文件

            在java目录下com.android.ndkdemo包下创建并编辑Java文件;

    package com.android.ndkdemo;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
        TextView tv1;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            int a = add(5,4);	//需要相加的两个数字
            tv1 = findViewById(R.id.tv);
            tv1.setText("a = " + a);	//在屏幕上显示a的结果
        }
    
        public native int add(int a, int b);
        static
        {
            //装载lib*.so文件
            System.loadLibrary("NativeAdd");
        }
    
    }

    3.5 生成Java头文件

            (1)cd app/src/main/java

            (2)javah -jni com.android.ndkdemo.MainActivity  该命令结束后,就在java目录下生成了头文件com_android_ndkdemo_MainActivity.h,内容如下,不用再修改jni.h了;

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

    3.6 编写C代码和Android.mk

            (1)在app/src/main/jni目录下新建AddNum.c文件,内容如下,与上一节一致;

    #include "com_android_ndkdemo_MainActivity.h"
    
    JNIEXPORT jint JNICALL Java_com_android_ndkdemo_MainActivity_add(JNIEnv *env, jobject thiz, jint a, jint b)
    {
        return a + b;
    }

            (2)在app/src/main/jni目录下新建Android.mk文件(jni目录上鼠标右键,New -> C/C++ File),内容如下;

    #include "com_android_ndkdemo_MainActivity.h"
    
    JNIEXPORT jint JNICALL Java_com_android_ndkdemo_MainActivity_add(JNIEnv *env, jobject thiz, jint a, jint b)
    {
        return a + b;
    }

    3.7 新建Application.mk

            (1)在app/src/main/jni目录下新建Application.mk,内容如下;

    APP_BUILD_SCRIPT := Android.mk	# 指明用于构建Android项目的mk文件的位置
    APP_PLATFORM := android-17	# 设置使用的ndk版本,使其与本地下载的ndk版本保持一致
    APP_ALLOW_MISSING_DEPS := true	# 与APP_PLATFORM := android-17一起起作用
    

    3.8 ndk-build

            (1)将 com_android_ndkdemo_MainActivity.h 头文件拷贝到jni目录;

            (2)cd ../jni

            (3)ndk-build NDK_APPLICATION_MK=Application.mk

            (4)ndk-build执行后会在jni所在的同级目录生成一个libs文件,其中每个子文件夹下都有一个libNativeAdd.so动态库文件,将其拷贝到java/com.android.ndkdemo目录下;

    3.9 测试

            这个时候连接手机进行测试,就能看到 界面显示 "a=9"。

    附录 

            基础
            | Android NDK开发之JNI基础篇

            实践
            | JNI与NDK编程知识基础详解
            | NDK 编译的三种方式
            | 在 NDK 开发中引入第三方静态库和动态库
            | NDK开发中Native与Java交互
            | Android NDK开发(二) 使用ndk-build构建工具进行NDK开发 - 简书

            进阶与补充
            | NDK开发中的几个重要知识点
            | JNI与NDK编程函数注册与C++调用Java详解
            | JNI与NDK编程常用方法史上最全总结和详解
            | Android NDK开发基础之C语言的内存管理

            文章链接总结
            | JNI与NDK编程(基础到精通)最全总结

    展开全文
  • android-gpuimage-ndkbuild-sample 使用基于 Android Studio 的 android-gpuimage 库的 Android NDK 构建示例 你应该看到 android-gpuimage 和 iOS GPUImage 框架 未来 我将比较 noen 和 android-gpuimage 库。
  • Android NDK开发及Sqlite3加密技术 张伟伟 2012/07/12 Android NDK开发 什么是NDK NDKNative Development Kit 1NDK是一系列工具的集合 NDK提供了一系列的工具帮助开发者快速开发C(或C++) 的动态库 NDK集成了交叉...
  • Android NDK R13 所有平台(Win 64/32, Linux, Mac) 给各位不方便科学上网的鞋童一个方便~
  • Android NDK jni常用的API

    2015-01-27 14:20:46
    Android NDK 开发时需要的 常用的JNI API
  • 基于AndroidNDK的智能灯光系统的设计与实现 基于AndroidNDK的智能灯光系统的设计与实现 基于AndroidNDK的智能灯光系统的设计与实现 基于AndroidNDK的智能灯光系统的设计与实现 基于AndroidNDK的智能灯光系统...
  • Android NDK开发动态加载so,采用System.load方法实现
  • Android NDK交叉编译FFmpeg

    千次阅读 2022-01-14 15:35:44
    1. 下载FFMPEG ... 2. 解压ffmpeg-4.2.2.tar.bz2 $ tar xvjfffmpeg-4.2.2.tar.bz2 3. 下载NDK 镜像下载路径:NDK 下载 | Android NDK | Android Developers 4. ...

    1. 下载FFMPEG
          http://ffmpeg.org/releases/ffmpeg-4.2.2.tar.bz2icon-default.png?t=LBL2http://ffmpeg.org/releases/ffmpeg-4.2.2.tar.bz2

    2. 解压ffmpeg-4.2.2.tar.bz2

       $ tar xvjf ffmpeg-4.2.2.tar.bz2

    3. 下载NDK

        镜像下载路径:NDK 下载  |  Android NDK  |  Android Developers

       

     4. 修改configure

    configre默认是gcc编译.

    但是新的ndk都是clang

    修改如下://默认改为clang 以及 clang++

    5. 编写编译脚本

     

    #!/bin/bash
    ###################################
    #### build script for FFMPEG
    #### url:
    #### Date: 2021-12-28
    #### Author: Tim
    ###################################
    
    # ndk for linux https://developer.android.google.cn/ndk/downloads?hl=zh-cn
    NDKROOT_PATH=/home/xxxx/workspace/tools/android-ndk-r23b
    
    # current dir
    CURRENT_PATH=$(pwd)
    PREFIX=$CURRENT_PATH/out/
    
    # Configure and build.
    # Only choose one of these, depending on your build machine...
    export TOOLCHAIN=$NDKROOT_PATH/toolchains/llvm/prebuilt/linux-x86_64
    # Only choose one of these, depending on your device...
    export TARGET=aarch64-linux-android
    #export TARGET=armv7a-linux-androideabi
    # Set this to your minSdkVersion.
    export API=28
    
    PREBUILT_TOOL_ARM64V8A_PATH=$TOOLCHAIN/bin/$TARGET$API-clang
    PREBUILT_TOOL_ARM64V8A_PATH_AR=$TOOLCHAIN/bin/llvm-ar
    PREBUILT_TOOL_ARM64V8A_PATH_CLANG=$TOOLCHAIN/bin/$TARGET$API-clang
    PREBUILT_TOOL_ARM64V8A_PATH_CLANG_PLUS=$TOOLCHAIN/bin/$TARGET$API-clang++
    
    if [ ! -f $TOOLCHAIN/bin/$TARGET$API-ar ];then
    ln -s $TOOLCHAIN/bin/llvm-ar $TOOLCHAIN/bin/$TARGET$API-ar
    fi
    
    if [ ! -f $TOOLCHAIN/bin/$TARGET$API-nm ];then
    ln -s $TOOLCHAIN/bin/llvm-nm $TOOLCHAIN/bin/$TARGET$API-nm
    fi
    
    if [ ! -f $TOOLCHAIN/bin/$TARGET$API-ranlib ];then
    ln -s $TOOLCHAIN/bin/llvm-ar $TOOLCHAIN/bin/$TARGET$API-ranlib
    fi
    
    GENERAL_64BIT="\
       --enable-cross-compile \
       --arch=aarch64 \
       --cpu=armv8-a \
       --cross-prefix=$TOOLCHAIN/bin/$TARGET$API-"
     
    GENERAL_32BIT="\
       --enable-cross-compile \
       --arch=arm \
       --cross-prefix=$TOOLCHAIN/bin/$TARGET$API-"
     
    MODULES="\
       --disable-avdevice \
       --disable-filters \
       --disable-programs \
       --disable-network \
       --disable-avfilter \
       --disable-postproc \
       --disable-encoders \
       --disable-protocols \
       --disable-hwaccels \
       --disable-doc"
     
    VIDEO_DECODERS="\
       --enable-decoder=h264 \
       --enable-decoder=mpeg4 \
       --enable-decoder=mpeg2video \
       --enable-decoder=mjpeg \
       --enable-decoder=mjpegb"
     
    AUDIO_DECODERS="\
        --enable-decoder=aac \
        --enable-decoder=aac_latm \
        --enable-decoder=atrac3 \
        --enable-decoder=atrac3p \
        --enable-decoder=mp3 \
        --enable-decoder=pcm_s16le \
        --enable-decoder=pcm_s8"
      
    DEMUXERS="\
        --enable-demuxer=h264 \
        --enable-demuxer=m4v \
        --enable-demuxer=mpegvideo \
        --enable-demuxer=mpegps \
        --enable-demuxer=mp3 \
        --enable-demuxer=avi \
        --enable-demuxer=aac \
        --enable-demuxer=pmp \
        --enable-demuxer=oma \
        --enable-demuxer=pcm_s16le \
        --enable-demuxer=pcm_s8 \
        --enable-demuxer=wav"
     
    VIDEO_ENCODERS="\
    	  --enable-encoder=huffyuv \
    	  --enable-encoder=ffv1 \
    	  --enable-encoder=mjpeg"
     
    AUDIO_ENCODERS="\
    	  --enable-encoder=pcm_s16le"
     
    MUXERS="\
      	  --enable-muxer=avi"
     
    PARSERS="\
        --enable-parser=h264 \
        --enable-parser=mpeg4video \
        --enable-parser=mpegaudio \
        --enable-parser=mpegvideo \
        --enable-parser=aac \
        --enable-parser=aac_latm"
     
     
    function build_ARM64
    {
    ./configure --target-os=linux \
        --prefix=${PREFIX} \
        ${GENERAL_64BIT} \
        --extra-cflags=" -O3 -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 " \
        --disable-shared \
        --enable-static \
        --enable-zlib \
        --disable-everything \
        ${MODULES} \
        ${VIDEO_DECODERS} \
        ${AUDIO_DECODERS} \
        ${VIDEO_ENCODERS} \
        ${AUDIO_ENCODERS} \
        ${DEMUXERS} \
        ${MUXERS} \
        ${PARSERS}
    make clean
    make install
    }
    
    build_ARM64
    
    
    
    
    
    
    
    

    展开全文
  • 最近项目开发中有添加C的库,需要配置NDK,首先按照正常步骤,先下载需要的NDK版本: File ->Settings ->Appearance &...Android NDK location无法选中修改配置,就连Download都无法点击,虽然上面显..

    最近项目开发中有添加C的库,需要配置NDK,首先按照正常步骤,先下载需要的NDK版本:

    File ->Settings ->Appearance & Behavior ->System Settings ->Android SDK
     

    下载完成之后我们到项目进行配置:

    File ->Project Structure ->SDK Location

     Android NDK location无法选中修改配置,就连Download都无法点击,虽然上面显示是已经配置,但是Project Structure SDK location 依然是没有配置NDK路径,如何解决:

    那就直接暴力修改:打开项目找到local.properties文件直接添加ndk.dir,然后找到前面下载的NDK在本地电脑的文件路径进行配置

     配置之后重新Snyc Project运行就可以了

    展开全文
  • 安装android NDK详细步骤

    千次阅读 2021-06-05 00:40:57
    Android NDK 即Native Development Kit,是Android的一种开发工具包。用于快速开发C、C++的动态库,并自动将so和应用一起打包成apk,即可通过NDKAndroid中使用JNI与本地代码(如C、C++)交互。其优点是运行效率高、...
  • windows下androidNDK环境配置
  • Android NDK使用Iconv进行编码转换

    热门讨论 2014-03-04 17:06:16
    Android NDK使用Iconv进行编码转换,可以在Unicode、GBK、UTF-8之前互转
  • Android NDK 环境配置

    千次阅读 2021-10-25 23:09:31
    Unsupported Downloads · android/ndk Wiki · GitHub 二、配置环境变量 (一)mac vim .bash_profile source .bash_profile # Android SKD export ANDROID_HOME=/Users/liyinchi/TestTool/android-sdk-...
  • NDKAndroid NDK下载安装教程

    千次阅读 2022-02-19 14:28:11
    目录Android NDK下载安装教程 不积跬步,无以至千里;不积小流,无以成江海。要沉下心来,诗和远方的路费真的很贵! Android NDK下载安装教程 打开Android Studio的 SDK Manager。 选中SDK Tools,选择要下载的...
  • 上一篇博客《conan入门(十):Windows下Android NDK交叉编译Boost》中已经说明了Windows下Android NDK交叉编译Boost的全过程。 本文在此基础上说明Linux下conan实现Android NDK交叉编译经常用到的的Boost库的过程。...
  • android ndk 纯c编程调用so文件 需要NDK

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 99,040
精华内容 39,616
关键字:

androidndk

友情链接: yzycjg.zip