前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AndroidStudio3.0NDK输出多个so库

AndroidStudio3.0NDK输出多个so库

作者头像
静默加载
发布2020-05-29 10:31:13
1.2K0
发布2020-05-29 10:31:13
举报
文章被收录于专栏:振兴的Android修炼手册

前言

去年的 Android之NDK开发初体验 这篇文章讲述NDK开发环境的搭建,以及在AndroidStudio3.0版本之前的NKDK简单开发。这次升级到Android Studio3.1,再次尝试NDK发现按照之前方法进行so生成会出现一些问题,写的文章已经不是普遍适用了。

代码语言:javascript
复制
Error: Your project contains C files but it is not using a supported native
代码语言:javascript
复制
To continue using the deprecated NDK compile for another 60 days, set   
android.deprecatedNdkCompileLease=1523451155771 in gradle.properties 

gradle.properties文件尾部添加android.useDeprecatedNdk=true出现第二个错误,在gradle.properties文件尾部添加android.deprecatedNdkCompileLease=1523451155771出现第一个错误。

AndroidStudio3.1使用CMake简单操作

这部分相关的文章有很多,我推荐一篇写的比较详细的博文: Android Studio3.0开发JNI流程------JNI入门级

  • 首先下载CMake,可以通过SDK-Mananger->SDK-Tools来下载CMake。
  • 然后添加C++ Support,这个要在新建项目的时侯,选择Include C++ Support就可以。
  • 然后项目自己创建后会生成Java类、cpp文件,自己编译生成so库直接运行项目就OK了。

CMake的使用

  • 使用CMake只需要修改cpp文件和CMakeLists.txt。
  • CMake生成的cpp文件位于app/src/main/cpp目录,并且cpp文件不需要再引入java类的h文件。
  • CMakeLists.txt位于app目录下

CMakeLists.txt

代码语言:javascript
复制
# 有关使用CMake在Android Studio的更多信息,请阅读文档:https://d.android.com/studio/projects/add-native-code.html

# 设置CMake的最低版本构建本机所需库
cmake_minimum_required(VERSION 3.4.1)

# 创建并命名库,将其设置为静态的
# 或共享,并提供其源代码的相对路径。
# 你可以定义多个library库,并使用CMake来构建。
# Gradle会自动将包共享库关联到你的apk程序。
# 添加库
add_library( # 设置库的名称
             native-lib
             # 将库设置为共享库。
             SHARED
             # 为源文件提供一个相对路径。
             src/main/cpp/native-lib.cpp )
# (导入系统库)搜索指定预先构建的库和存储路径变量。因为CMake包括系统库搜索路径中默认情况下,只需要指定想添加公共NDK库的名称,在CMake验证库之前存在完成构建
find_library( # 设置path变量的名称
              log-lib
              # 在CMake定位前指定的NDK库名称
              log )
# (链接目标库)指定库CMake应该链接到目标库中,可以链接多个库,比如定义库,构建脚本,预先构建的第三方库或者系统库
target_link_libraries( # 指定目标库
                       native-lib
                       # 目标库到日志库的链接 包含在NDK
                       ${log-lib} )

添加native方法

添加native方法.png

Alt+Enter快捷键自动创建C++方法,不需要头文件。

生成多个so文件

  • java层多次加载so库
代码语言:javascript
复制
// Used to load the 'native-lib' library on application startup.
static {
    System.loadLibrary("native-lib");
}
代码语言:javascript
复制
public class JNIUitls {
    static {
        System.loadLibrary("jnilib");
    }

    public static native String getNameString();

    public native int getNumber();
}
  • 在cpp目录下创建对应的.cpp文件
  • 在CmakeLists.txt文件中对应添加so库和链接so库
代码语言:javascript
复制
#添加库
add_library( # Sets the name of the library.
             native-lib
             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp
             )
#添加库
add_library(jnilib SHARED src/main/cpp/jnilib.cpp)

#导入系统库
find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

#链接目标库
target_link_libraries( # Specifies the target library.
                       native-lib
                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )
#链接目标库
target_link_libraries(jnilib ${log-lib})

so.png

项目地址:JNIApplication

(https://github.com/stven0king/JNIApplication.git)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • AndroidStudio3.1使用CMake简单操作
      • CMake的使用
        • CMakeLists.txt
          • 添加native方法
            • 生成多个so文件
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档