记录Android studio JNI开发的三种方式(推荐)

 更新时间:2017年12月18日 09:39:55   转载 作者:supter川  
JNI (Java Native Interface)是一套编程接口,用来实现Java代码和其他语言(c、C++或汇编)进行交互。下面通过本文给大家讲解Android studio JNI开发的三种方式,需要的朋友参考下吧

概述

在Andorid Studio不支持JNI开发之前大家一般都是使用Eclipse开发JNI,各种配置让人觉得很蛋疼。从Andorid Studio支持JNI开发后,让我们开发JNI变的如此简单。

NDK 和 JNI介绍

JNI (Java Native Interface)是一套编程接口,用来实现Java代码和其他语言(c、C++或汇编)进行交互。这里需要注意的是JNI是JAVA语言自己的特性,也就是说JNI和Android没有关系。在Windows下面用JAVA做开发也经常会用到JNI,例如:读写系统注册表等。

NDK(Native Development Kit)是Google提供的一套工具集,可以让你其他语言(C、C++或汇编)开发 Android的 JNI。NDK可以编译多平台的so,开发人员只需要简单修改 mk 文件说明需要的平台,不需要改动任何代码,NDK就可以帮你编译出所需的so。

用JNI做应用开发难度要比JAVA难很多,门槛也要高很多,如果你对C/C++把握的不好应用还会出现难以发现的Bug!所以通常在对性能要求比较高才会使用。游戏引擎就是一个对性能要求极高的例子。另外就是如果你想把核心的一些算法或处理逻辑保护起来,选用JNI也是一个不错的方案。

下面给大家记录Android studio JNI开发的三种方式,具体内容如下所示:

第一种        

  第一步: 创建natice本地方法
       第二步: 在工程App模块目录下创建jni文件夹
       第三步: 在jin文件夹中创建.c结尾的c文件,编写c代码,在c语言中定义在Java代码中创建的本地方法(natice方法)
        ,要按照jni的规范定义方法(Java_包名_类名_natice方法名,其中包名中的点用_代替)
       第四步: 在jni文件夹中创建Android.mk文件,文件内容如下
       LOCAL_PATH := $(call my-dir)
       include $(CLEAR_VARS)
       LOCAL_MODULE  := hello #指定生成的库名 lib库名.so
       LOCAL_SRC_FILES := hello.c #指定要编译的C语言源文件 多个空格排开
       include $(BUILD_SHARED_LIBRARY) #指定生成库类型(静态库 动态库 独立程序) 动态库
       第五步: 在src文件夹下创建Application.mk,内容如下
       APP_ABI := all #指定生成库平台
       第六步: 编译c代码生成so库,到c代码所在的目录里面按住shift点击鼠标右键,
        选中在此处打开命令窗口(首先你要把ndk-build配置到环境变量中),执行ndk-build,
        会自动生成Application.mk配置的so库
       第七步: 在App模块下配置jinLibs的路径执行libs
             sourceSets{
              main{
                    jniLibs.srcDirs=[“libs”]
                 }
                }
        第八步: 静态代码块加载
            Static{
                    System.laodLibrany(“hello”)
               }
       第九步:运行

第二种

第一步: 创建natice本地方法
第二步: 选中APP模块点击鼠标依次选择new->folder->JNI folder->finish
会在main目录下生成一个jni文件夹
第三步: 在jin文件夹中创建.c结尾的c文件,编写c代码,在c语言中定义在Java代码中创建的本地方法(natice方法),
要按照jni的规范定义方法(Java_包名_类名_natice方法名,其中包名中的点用_代替)
第四步: 在模块的build.gradle deflautConfig标签中配置库名和指定生成的平台
 ndk{
   moduleName “hello”//生成的库名
   abiFilters “armeabi”,”armeabi-v7a”,”x86”//生成的平台
 }
第五步: 静态代码块加载
  Static{
     System.laodLibrany(“hello”)
  }
第六步:运行

第三种(Cmake)as版本2.2之后才可以使用

第一步: 创建natice本地方法
第二步:在main下面创建cpp文件夹,再在cpp文件夹中穿件c源文件
  按jni规范编写被java调用的方法
第三步:创建CMakelists.txt文件,里面配置了生成的库名和连接的库名还有c代码的路径(CMakelists.txt生成方式
,要新建一个项目一定要选中include c++ suppot,选中之后创建的工程中就会有CMakelists.txt文件,
并且还有Google给出的例子)
第四步: 选中模块点击鼠标右键,选中link c++ progect with gradle之后弹出Cmake对话框,选择CMake方式,
再找到模块下生成的CMakeLists.txt之后ok
如果报错了检查CMakeLists.txt是否配置错了,如果没有报错就添加成功了,会在build.gradle生成externalNativeBuild标签
第五步:配置生成的so库平台,在deflautConfig标签下面创建externalNativeBuild标签
 externalNativeBuild{
  cmake{
    abiFilters “armeabi”,”armeabi-v7a”,”x86”//生成的平台
  }
 }
配置完成用静态代码块的方式加载so库
  Static{
    System.laodLibrany(“hello”)
  }

可能出现的错误

1, No implementation found for
  意思是函数没有实现,
            1,检查c中的方式是否正确(按jni规范)
            2,是否静态加载了库,库名是否写错

2, > Error: Your project contains C++ files but it is not using a supported native build system.
Consider using CMake or ndk-build integration with the stable Android Gradle plugin:

大概意思是你的ndk不是最新的

          1,下载一个最新版本的ndk
          2,在gradle.properties中配置
          Android.useDeprecatedNdk=true(允许使用过时ndk)

总结

以上所述是小编给大家介绍的记录Android studio JNI开发的三种方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Android的异步任务AsyncTask详解

    Android的异步任务AsyncTask详解

    本文给大家介绍的是Android的异步任务AsyncTask,在Android中实现异步任务机制有两种方式,Handler和AsyncTask。今天我们先来主要谈下ASYNCTASK。
    2015-07-07
  • Android下拉刷新控件SwipeRefreshLayout源码解析

    Android下拉刷新控件SwipeRefreshLayout源码解析

    这篇文章主要为大家详细解析Android下拉刷新控件SwipeRefreshLayout源码,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Android  ListView 条目多样式展示实例详解

    Android ListView 条目多样式展示实例详解

    这篇文章主要介绍了Android ListView 条目多样式展示的相关资料,需要的朋友可以参考下
    2017-04-04
  • Android开发教程之ContentProvider数据存储

    Android开发教程之ContentProvider数据存储

    这篇文章主要介绍了Android开发教程之ContentProvider数据存储的相关资料,需要的朋友可以参考下
    2016-12-12
  • Android6.0仿微信权限设置

    Android6.0仿微信权限设置

    这篇文章主要为大家详细介绍了Android6.0仿微信权限设置的相关内容,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android使用surfaceView自定义抽奖大转盘

    Android使用surfaceView自定义抽奖大转盘

    这篇文章主要为大家详细介绍了Android使用surfaceView自定义抽奖大转盘,熟练掌握SurfaceVie实现抽奖大转盘,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Jsoup 抓取页面的数据实例详解

    Jsoup 抓取页面的数据实例详解

    这篇文章主要介绍了Jsoup 抓取页面的数据实例详解的相关资料,需要的朋友可以参考下
    2016-12-12
  • 详解Android Selinux 权限及问题

    详解Android Selinux 权限及问题

    本篇文章主要介绍了详解Android Selinux 权限及问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 谈谈Android6.0运行时的权限处理

    谈谈Android6.0运行时的权限处理

    之前有人在 Android 6.0 的机型上运行了DragGridView结果出异常奔溃了。想必问题的原因大家都知道,是Android 6.0新引入了在运行时权限申请(Runtime Permissions)的功能。那么这所谓的运行时申请权限究竟是怎么一回事呢,下面跟着小编一起来看看吧!
    2016-08-08
  • Android ImageSelector微信图片选择器

    Android ImageSelector微信图片选择器

    这篇文章主要为大家详细介绍了Android ImageSelector微信图片选择器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06

最新评论