美文网首页
Android Studio NDK开发攻略(JNI)

Android Studio NDK开发攻略(JNI)

作者: trayliu_小马过河 | 来源:发表于2016-06-28 18:24 被阅读71次

    JNI

    Java Native Interface,java本地接口。通俗地说,JNI是一种技术,通过这种技术可以做到以下两点:
    · Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++编写的函数。
    · Native程序中的函数可以调用Java层的函数,也就是在C/C++程序中可以调用Java的函数。

    Android平台中JNI示意图.png
    为什么使用NDK

    1.代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
    2.可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。
    3.提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
    4.便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

    NDK下的C/C++函数和Java桥接的函数命名规则:

        Java_PackageName_ClassName_MethodName
    

    对应的java 文件 包名—类名—方法名

    编码GBK的不可映射字符.png

    解决方法:javah -encoding utf-8 -jni com.echo.soundbar.SecondActivity

    Execution failed for task ':app:compileDebugNdk'.

    app:compileDebugNdk.png

    这个问题是NDK在windows平台下面的一个BUG,如果编译的.c/.cpp只有一个,就会出现这个问题
    解决办法:随意新建任意的.c 和.h文件即可编译通过,这是死丢丢的bug,从1.5到2.1

    Paste_Image.png

    当Terminal不在主目录的时候,无法执行clean操作。

    Paste_Image.png

    Gradle添加NDK模块

    打开app模组下的build.gradle文件,在defaultConfig模块下添加ndk模块

        ndk{   
        moduleName "SoundBar"   //NDK模块  System.loadLibrary()加载.so时的名称对应   
        ldLibs "log", "z", "m"//链接的库   
         abiFilters "armeabi", "armeabi-v7a", "x86"//共七个未指定则全部编译
        }
    
    moduleName

    是编译的.so的模组名称,就是原先Eclipse开发里Android.mk文件中LOCAL_MODULE变量,和System.loadLibrary()加载.so时的名称对应。

    abiFilters

    指定要分配的平台,如果未指定,则将编译所有支持的平台。目前支持的平台有"armeabi"、"armeabi-v7a"、"arm64-v8a"、"mips"、"mips64"、"x86"、"x86_64"这七个;

    ldLibs

    是要链接的库,就是原先Android.mk里LOCAL_LDLIBS变量指定的库。

    Paste_Image.png

    在gradle.properties s文件末尾里面添加 android.useDeprecatedNdk=true 后重新编译即可

    生成so文件的位置

    在app/build/intermediates/ndk/debug目录下生成了三个文件夹,对应在build.gradle配置的abiFilters。

    生成so文件的位置.png

    添加C/C++文件

    默认情况下,C/C++文件一般放在[module]/src/main/jni/目录下,如图:

    c 、c++文件默认存放位置.png

    当然,你也可以修改build.gradle配置,指定其他路径。在"android.sourceSets.main"模块里,使用"jni.srcDirs"指定jni的路径,如下图:

    指定jni 路径.png

    使用android studio进行ndk 开发

    修改本地配置文件


    local.properties
        sdk.dir=D\:\\SoftwareForCode\\adt-bundle-windows-x86_64-20140702\\sdk
        ndk.dir=D\:\\SoftwareForCode\\adt-bundle-windows-x86_64-20140702\\android-ndk-r10
    

    第一步:创建java本地接口

    参考:http://wiki.jikexueyuan.com/project/deep-android-v1/jni.html
    http://gold.xitu.io/entry/57086e1fa34131004c0b13d5
    http://www.codernote.top/blog/info/138
    http://www.xpabc.com/xpabc/article/show/189.htm

    相关文章

      网友评论

          本文标题:Android Studio NDK开发攻略(JNI)

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