美文网首页
Android生成库文件

Android生成库文件

作者: 听风不予 | 来源:发表于2019-01-14 09:11 被阅读0次

    AndroidStudio上使用了一段时间的NDK,感觉官方的插件com.android.tools.build.gradle-experimental还是不够稳定,存在一定问题,不过谷歌也声明了这个插件是在实验性阶段。幸好官方在Android Studio上提供了另一种方式使用NDK,我们参考这种方法来实现,非常方便

    开发环境

    基础的安卓开发环境:Android Studio、SDK、JDK

    下载好NDK,自己手动下载或者用SDK工具下载都可以我使用的版本:Android Studio 1.5.1

    配置常用命令

    NDK开发比较常用的命令就是生成头文件、构建so包,在android studio上我们可以先配置好命令。

    如下图所示,我添加了三个命令,按加号添加

    [if !vml]

    [endif]

    其中一个命令的配置详情如下图:

    [if !vml]

    [endif]

    命令配置参数:

    javah用于生成头文件

    Program:$JDKPath$/bin/javah

    Parameters: -encodingUTF-8 -d ../jni -jni $FileClass$

    注意:这个命令我加上了-encoding UTF-8指定编码,你可以改成你工程的编码。

    Working directory: $SourcepathEntry$\..\Java

    ndk-build用于构建so包

    Program: 你的NDK目录\build\ndk-build.cmd

    注意:windows用ndk-build.cmd,MAC/Linux用ndk-build

    Parameters: 什么都不用填

    Working directory:$ModuleFileDir$\src\main

    ndk-build clean清除so包

    Program: 你的NDK目录\build\ndk-build.cmd

    注意:windows用ndk-build.cmd,MAC/Linux用ndk-build

    Parameters: clean

    Working directory:$ModuleFileDir$\src\mainmakefile 用于生成android.mk和application.mk

    以及向gradle.properties和local.properties文件中添加的固定配置

    [if !vml]

    [endif]

    Program: 你的NDK目录\makefile.cmd

    注意:makefile.cmd源码如下,请自行放到对应上面的目录

    Parameters: $FileName$$ProjectFileDir$

    Working directory: $FileDir$

    makefile.cmd源代码如下:

    @echooff

    rem 参数1无需手动传入,右键执行makefile命令即可

    rem c/c++源文件名(带后缀名)

    set Paramter1=%1

    rem 参数2项目所在目录

    set Paramter2=%2

    set Dot=%Paramter1:~-2,-1%

    rem 自动判断c/c++文件,生成相应参数

    if

    "."=="%Dot%" (

    set FileName=%Paramter1:~0,-2%

    ) else (

    set FileName=%Paramter1:~0,-4%

    )

    rem Android.mk文件中参数

    echo LOCAL_PATH := $(call my-dir)> Android.mk

    echoinclude $(CLEAR_VARS)>>Android.mk

    echo. >> Android.mk

    echo LOCAL_MODULE := %FileName%>> Android.mk

    echo |set/p=LOCAL_SRC_FILES :=>> Android.mk

    rem 遍历当前文件夹下所有c/c++源文件

    FOR /R  %%iin ( *.c *.cpp ) do (

    echo |set /p= %%~nxi>> Android.mk

    )

    echo.>> Android.mk

    echoinclude $(BUILD_SHARED_LIBRARY)>>Android.mk

    rem Application.mk文件中参数

    echo APP_MODULES := %FileName%> Application.mk

    echo. >> Application.mk

    echoAPP_ABI := all >> Application.mk

    rem

    gradle.properties中追加配置

    echo.>> %Paramter2%/gradle.properties

    echo android.useDeprecatedNdk=true>> %Paramter2%/gradle.properties

    rem

    local.properties中追加配置

    echo.>> %Paramter2%/local.properties

    rem 注意:D\:\\DevelopKit\\android-ndk-r10e这个改成自己的NDK所在目录

    echo ndk.dir=D\:\\DevelopKit\\android-ndk-r10e>> %Paramter2%/local.properties

    注意:D:\DevelopKit\android-ndk-r10e 这个改成自己的NDK所在目录,其他的就不用改了命令使用说明:

    javah

    命令:在包含native方法的类上执行,会生成对应该类的头文件,如果有多个包含native方法的类,对应执行一次

    makefile

    命令:点击希望成为模块的c/c++源文件,以此源文件的文件名为模块,对应Android.mk中的LOCAL_MODULE和

    Application.mk

    中的APP_MODULES,LOCAL_SRC_FILES后面的参数会根据jni目录下的c/c++源文件全部罗列上去。参考下图理解

    [if !vml]

    [endif]

    [if !vml]

    [endif]

    补充这些可以不用配置

    Android.mk

    自动生成,可以修改其中的配置

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE := hello-jni

    LOCAL_SRC_FILES := hello-jni.cpphello-jni2.cpp

    include $(BUILD_SHARED_LIBRARY)

    Application.mk自动生成,可以修改其中的配置

    APP_MODULES :=hello-jni

    APP_ABI := all

    local.properties 自动添加固定配置

    ndk.dir=你的NDK目录的绝对路径

    D:\DevelopKit\android-ndk-r10e 这是我的NDK目录

    gradle.properties 自动添加固定配置

    android.useDeprecatedNdk= true

    直接改好上面makefile.cmd(这个文件是用dos命令行编写的)中对应自己的配置就可以了。是不是又让你减少点体力?希望如此吧,嘿嘿…

    对于我添加的这段补充,有什么不懂得可以问我,博客的配置流程,我也亲自试用了,为大神点赞,特别好用,推荐大家看看哦。

    配置完三个命令之后,你就可以在右键菜单中找到这几个命令,可以直接使用。如下图演示了生成NdkTest类的头文件

    [if !vml]

    [endif]配置工程

    让工程项目使用NDK,需要做一些配置工作在local.properties文件中填写使用的NDK

    ndk.dir=你的NDK目录的绝对路径

    [if !supportLists]·      [endif]1

    [if !supportLists]·      [endif]1

    gradle.properties文件中添加如下代码

    android.useDeprecatedNdk = true

    在module的build.gradle添加如下代码:

    android {

      {  ndk

          {

    moduleName "NdkTest"//定义NDKlibrary的名字

              //ldLibs "log"添加log库,看自己需求

          }

      }

      //这里设置目录,默认就这样写就可以了

      sourceSets {

          main {

                jni.srcDir "src/main/jni"

                jniLibs.srcDir"src/main/libs"

          }

      }

    }

    Hello word

    按上面的步骤全都配置完之后就可以在Android

    Studio上享受NDK了。下面写一个简单的返回Hello word字符串的程序。

    首先在java中声明一个本地方法,并加载本地库,如下:

    public class NdkTest

    {

        static {

            System.loadLibrary("NdkTest");

        }

        public static native String getString();

    }

    生成它的头文件(自动生成的名字是包名+类名me_majiajie_ndktest_NdkTest.h),并且创建c/c++文件(NdkTest.cpp),如下:

    #include"me_majiajie_ndktest_NdkTest.h"

    JNIEXPORT jstringJNICALL Java_me_majiajie_ndktest_NdkTest_getString

    (JNIEnv *env, jclass jc)

    {

          returnenv->NewStringUTF("Hello word !!!");

    }

    在jni目录创建一个文件命名为Android.mk,填入以下内容

    LOCAL_PATH := $(callmy-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE :=NdkTest

    LOCAL_SRC_FILES :=NdkTest.cpp

    include$(BUILD_SHARED_LIBRARY)

    然后在jni目录创建一个文件命名为Application.mk,填入以下内容

    APP_MODULES :=NdkTest

    APP_ABI := all

    注意:Android.mk和Application.mk都是NDK默认的配置文件,关于这两个文件的详细介绍可以看官网。最后生成so包就可以了,记住每次修改C文件都需要重新生成so包:

    相关文章

      网友评论

          本文标题:Android生成库文件

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