美文网首页AndroidAndroid知识Android开发
Android Studio之NDK环境搭建,so文件打包以及使

Android Studio之NDK环境搭建,so文件打包以及使

作者: david_zhw | 来源:发表于2017-03-13 17:19 被阅读2358次

关于ndk,jni的介绍请自行谷歌、百度。推荐查看网友的ndk系列文章,写的较为详细,深入Android NDK开发(该系列教程开发环境为win + Eclipse)

本篇入门教程开发环境为mac + Android Studio + gradle 2.14.1,主要包含以下3块内容:

  • NDK环境搭建
  • 编写第一个JNI项目
  • 打包出动态so文件,在其他项目中使用

一、NDK环境搭建

  1. 从Android Studio安装(自行翻墙)
    打开AndroidStudio,选择顶部工具条,Tools->Android->SDK Manager->SDK Tools->NDK 点击install

  2. 自行下载ndk包
    1)国内推荐通过AndroidDevTools镜像下载,或者Google的官方网站下载Android NDK的安装包https://developer.android.com/ndk/downloads/index.html

    NDK r13b

    2)下载ndk包后解析到某个路径,打开Project Structure->设置 NDK location

    AndroidDevTools 下载
  3. ndk环境变量配置,我们需要使用到ndk-build命令
    打开终端 -> 输入 :vim ~/.bash_profile -> 加入ndk 包的路径(mac中环境变量之间以封号隔开)

自此,ndk开发环境我们已经可以进行jni开发了

二、JNI开发

  1. 创建android项目
  2. 查看项目local.properties中加入ndk和sdk的路径是否正确
ndk.dir=/Users/userName/AndroidStudioProjects/ndk/android-ndk-r13b
sdk.dir=/Users/userName/Library/Android/sdk
  1. 配置项目下的gradle.properties文件,表示我们要使用NDK进行开发。
android.useDeprecatedNdk=true
  1. 在moudle根目录下的的build.gradle中的defaultConfig标签内部里加入如下代码
ndk{    
   moduleName "hello"       //生成的so文件名字,调用C程序的代码中会用到该名字    
   abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种平台下的so库,
   // 还可以添加 'x86_64', 'mips', 'mips64'
}
  1. 编写jni代码
package com.david.ndktest;
-
public class MainActivity extends AppCompatActivity {

    //使用静态代码块,表示我们要加载的资源文件为libsecret.so
    static {
        System.loadLibrary("secret");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv_msg = (TextView) findViewById(R.id.tv_msg);
        tv_msg.setText(stringFromat());

    }
    //声明一个本地方法,用native关键字修饰
    public native String stringFromat();
}
  1. 生成.h头文件
    直接使用Android Studio 底部的Terminal,默认命令行窗口路径已经在当前项目,进入到app/src/main/java目录,输入以下命令(固定格式:javah -jni 包名+类名)
javah -jni com.david.ndktest.MainActivity
为在对应包的根目录下生成.h文件,熟悉该函数名后,日常开发中可以不用生成.h文件 生成头文件
  1. 执行第5部的时候,对应native会提示找不到对应方法,快捷键 alt+enter 会生成对应jni文件夹,包含libName.c文件,此处MainActivity中的native方法还是会显示红色,但是不影响编译


    生成.c文件
  2. 编译项目后会发现app/build中已经生成so文件,并且已经对应的cpu包就是我们在gradle中已经配置的,并且已经调用成功

build中生成对应so文件 成功调用native方法

自此我们的第一个JNI项目已经编写完毕

三、打包出动态so文件,在其他项目中使用

有时候我们的需求是这样的,我们把一些比较重要的业务逻辑封装到ndk内部,对java层只暴露接口。我们就需要打包出so文件,并且可能需要在其他项目中使用,下面将介绍so(符合JNI标准)文件的打包,以及在其他项目中如何正确的调用

  • 编写Android.mk文件,放到jni文件夹根目录,与.c文件同级
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := secret //lib 名
LOCAL_SRC_FILES := \
    /Users/userName/AndroidStudioProjects/NdkTest/app/src/main/jni/secret.c \ //.c文件名

include $(BUILD_SHARED_LIBRARY)
  • 使用ndk-build命令(需要配置ndk环境变量,参照第一步第3点),生成so文件

    进入到main目录后在terminal中输入命令,ndk-build工具便会帮我们打包出所有cpu平台so文件(目前不知道如何设置需要打包cpu平台)

ndk-build
building so文件 main根目录下生成lib,obj目录
  • 其他项目中使用该so文件
  • 拷贝so文件到项目的main/jniLibs目录
  • 新建package,包名与类名以及方法名必须与生成so文件的类保持一致!
  • 使用loadLibrary加载动态库,声明native方法


  • 调用native方法
com.keywea.duolintest;
-
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv_msg = (TextView) findViewById(R.id.tv_msg);
        tv_msg.setText(com.david.ndktest.MainActivity.stringFromat());

    }
}

自此我们已经能够接入符合JNI标准的so库,重点在于包名,类名,方法名需要与so库保持一致,因此我们在提供so库的时候一定要记录详细的交互文档

相关文章

网友评论

  • NN又回来了:没有说怎么调用里面的函数的啊
    david_zhw:@pull2car native函数就是哦
  • soulrelay:记得使用一些第三方服务提供的so库,也没说要包名,类名,方法名需要与so库保持一致,就算要保持一致,按楼主上面的例子,别人用你的so库,还得和你的名字什么一致,有点负担啊,有什么好的规范吗
    soulrelay:@david_zhw 刚才查了一下,看了下友盟推送的SDK,确实是这样
    david_zhw:@soulrelay 有没发现第三方库基本都带jar包,包里面去调用so文件。直接扔so给别人用的一般内部人才会这样
  • 6a7e49f16f00:请问 =新建package,包名与类名以及方法名必须与生成so文件的类保持一致!==
    使用方法与第二部一致,需要声明,这个怎么理解呀?
    david_zhw:跟第二步的第五步骤一样,就是需要loadlibary,文字表达的不清楚- -。不好意思回复晚了。
  • 6a7e49f16f00:请问,第6步生成.h头文件不是必须得吗?可以忽略这步?
    david_zhw:@Liaoer 可以跳过,到第七部,idea会帮我们自动创建
  • 风舞尘起:能出个教程,编译下新版libjpeg和libjpng吗?网上的都没64位的
    david_zhw:@风舞尘起 能力有限:joy:
  • 791f15957501:cmake构建比较爽。
    NN又回来了:是挺爽的,后面不会调用了,你有没有调用过so中的函数。

本文标题:Android Studio之NDK环境搭建,so文件打包以及使

本文链接:https://www.haomeiwen.com/subject/ddhqnttx.html