概述
在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开发的三种方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
本文向大家介绍js改变css样式的三种方法推荐,包括了js改变css样式的三种方法推荐的使用技巧和注意事项,需要的朋友参考一下 共用代码: <div id="div"> this is a div </div> var div=document.getElementById('div'); 第一种:用cssText div.style.cssText='width:250px;height:250
本文向大家介绍Oracle批量插入数据的三种方式【推荐】,包括了Oracle批量插入数据的三种方式【推荐】的使用技巧和注意事项,需要的朋友参考一下 第一种: 第二种: 第三种(利用中间表): 总结 以上所述是小编给大家介绍的Oracle批量插入数据的三种方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!
本文向大家介绍python记录程序运行时间的三种方法,包括了python记录程序运行时间的三种方法的使用技巧和注意事项,需要的朋友参考一下 python记录程序运行时间的三种方法 这里提供了python记录程序运行时间的三种方法,并附有实现代码,最后进行比较,大家参考下: 方法1 方法 2 方法3 方法1和方法2都包含了其他程序使用CPU的时间,是程序开始到程序结束的运行
本文向大家介绍ORACLE查询删除重复记录三种方法,包括了ORACLE查询删除重复记录三种方法的使用技巧和注意事项,需要的朋友参考一下 比如现在有一人员表 (表名:peosons) 若想将姓名、身份证号、住址这三个字段完全相同的记录查询出来 可以实现上述效果. 几个删除重复记录的SQL语句 1.用rowid方法 2.用group by方法 3.用distinct方法 1。用rowid方法 据据or
本文向大家介绍Java开发中的23种设计模式详解(推荐),包括了Java开发中的23种设计模式详解(推荐)的使用技巧和注意事项,需要的朋友参考一下 设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使
本文向大家介绍详解Golang开启http服务的三种方式,包括了详解Golang开启http服务的三种方式的使用技巧和注意事项,需要的朋友参考一下 前言 都说go标准库实用,Api设计简洁。这次就用go 标准库中的net/http包实现一个简洁的http web服务器,包括三种版本。 v1最简单版 直接使用http.HandleFunc(partern,function(http.Response