android studio下JNI开发流程
来源:互联网 发布:国外的导航软件 编辑:程序博客网 时间:2024/06/10 17:39
一步一步做Android Studio下JNI开发
Android Studio是Google基于IntelliJ IDEA专门为Android开发而定制的集成开发环境。在2013年5月的Google大会上首次发布。Goolge宣布2015年底就中止Eclipse官方支持,所以是时候拥抱Android Studio了。
先来看下相关知识背景
1.什么是JNI?
Java native interface是一种协议,并提供一套编程框架,让java和本地语言(C/C++)之间能够相互调用。
2.为什么需要JNI呢?
Java是一种平台无关的语言,通过不同操作系统下具有相同功能的JVM实现一次编译,可以到处运行。也正是因为JVM,使得Java程序运行的效率相对于C/C++等本地语言较低,而且不能像C/C++一样直接操作底层硬件。因为C/C++本地语言编译程序是直接被操作系统运行,而不需要类似Java的虚拟机。
所以如果Android app需要操作底层硬件,或要求应用的运行效率,安全性,就可以使用JNI来实现java和本地C/C++语言之间的相互调用。
3.那什么是NDK呢?
Native Development Kit 本地开发工具集。简单的说就是一整套工具,用来构建、编译本地c/c++源程序,生成.so动态库,加入本地库中,让Android应用程序中Java程序通过jni调用。
JNI和NDK关系见图1
4.怎样进行JNI开发呢?
之前大家使用Eclipse+CDT+NDK进行JNI开发,转到Android Studio后怎样来进行JNI开发呢?
需要指出的是Android Studio当前对NDK的支持还处于测试阶段,还未产生稳定的支持。随着Android Studio版本的升级,开发方式还在变化。本文使用的环境是Android Studio1.4稳定版,gradle 2.4。
下面就通过一个简单的例子介绍怎样用Android Studio进行JNI开发。
先上效果见图2
例子很简单,android应用程序TestJni中java借助JNI调用本地C函数,获得一个字符串,并用Toast提示在界面上。
step1:首先新建一个Module模块,TestJni,新建一个包com.itheima.jni
,和一个专门存放本地方法的类JNI。然后用native关键字声明本地方法helloFromC
package com.itheima.jni; /** * Created by tim on 2015/12/15. */ public class JNI { //本地方法获得字符串,本地方法由c/c++实现 public static native String helloFromC(); }
step2:在MainActivity类中调用JNI类中的本地方法,获得字符串,并用Toast打印输出
package com.itheima.testjni; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; import com.itheima.jni.JNI; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); JNI jni = new JNI(); Toast.makeText(this, jni.helloFromC(), Toast.LENGTH_SHORT).show(); } }
step3:在testjni模块中新建存放c源文件的jni文件夹step4:在jni文件夹下新建c/c++源文件,这里新建了hello-jni.h和hello-jni.c可选.c/.h用C语言实现,或者.cpp/.h用C++语言实现新建完成后得到hello-jni.c源文件和相关的hello-jni.h头文件
step5: 编译一下module testini,生成.class字节码文件,进入testjni\build\intermediates\classes\debug目录下,在Terminal窗口利用javah命令生成jni相关头文件
Terminal窗口中执行命令> javah 存放JNI类的包名.JNI类名
生成com_itheima_jni_JNI.h头文件,将这个头文件拷贝到jni文件夹下
在hello-jni.c文件开头包含生成的头文件com_itheima_jni_JNI.h
#include "com_itheima_jni_JNI.h" //包含生成的头文件并将com_itheima_jni_JNI.h头文件中,本地方法对应函数声明拷贝到hello-jni.c文件中,方便下一步来实现这个函数step6:实现本地方法相应的Java_com_itheima_jni_JNI_helloFromC函数功能,返回一个Java中的String字符串对象
JNIEXPORT jstring JNICALL Java_com_itheima_jni_JNI_helloFromC (JNIEnv * env, jclass obj){ char buf[] = "Hello world from C!"; //env调用struct JNINativeInterface中的函数指针 //实现转换c里面的char *字符串为java中的String对象 return (*env)->NewStringUTF(env, buf); }
step7:需要给Android Studio指定NDK路径
step8:在module的build.gradle文件中指定生成的.so动态库名hello-jni,这个库名需要在JNI类中加载在defaultConfig{}中添加ndk{}
defaultConfig { applicationId "com.itheima.testjni" minSdkVersion 10 targetSdkVersion 23 versionCode 1 versionName "1.0" ndk{ //指定生成模块名字,也就是最终的动态库名hello-jni,相应库文件名libhello-jni.so moduleName "hello-jni" //指定生成哪些处理器架构的动态库文件,如果要运行在x86架构处理器一定需要指定 abiFilters "armeabi" , "x86" } }
step9:在JNI类中加载动态库
package com.itheima.jni; /** * Created by tim on 2015/12/15. */ public class JNI { static{ //指定库名,加载动态库,需要和build.gradle中指定的库名一致 System.loadLibrary("hello-jni"); } //本地方法获得字符串,本地方法由c/c++实现 public static native String helloFromC(); }
step10:编译这个模块等待结果......结果,纳尼?编译报错了!
Error:(14, 1) A problem occurred evaluating project ':testjni'.
> Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.
淡定!
仔细一读,原来是NDK集成在当前Gradle插件中弃用,建议用新的实验性插件,或者在工程中gradle.proerties中设置android.useDeprecatedNdk=true
ok照办。再次编译成功,部署到模拟器上看效果
流程到此结束。
后面再更实验性gradle插件开发jni时有多强大!
参考:
https://zh.wikipedia.org/wiki/Android_Studi 0 0
- android studio下JNI开发流程
- Android Studio开发JNI流程
- Android studio下的DNK开发JNI详解流程
- Android Studio下 NDK配置与Jni开发流程
- Android Studio下JNI开发
- Android Studio下JNI开发
- JNI(一) - Android Studio简单开发流程
- Android Studio JNI 流程
- Android Studio NDk-JNi开发(二)AS下开发流程
- Android Studio下OpenCV及JNI开发
- 一步一步做Android Studio下JNI开发
- 一步一步做Android Studio下JNI开发
- Android studio 下的JNI开发
- Android Studio下OpenCV及JNI开发
- Android studio下JNI(NDK)开发
- Android studio下JNI(NDK)开发
- Android Studio下OpenCV及JNI开发
- Android Studio下开发JNI第一步
- iOS学习路线图
- Windows安装多个Tomcat服务
- 第十五章 动态规划
- [未完成]对于渲染阴影场景的unitcube剔除方法
- Android Touch事件详解
- android studio下JNI开发流程
- 原生体验挡不住!JavaScript开源跨平台框架NativeScript
- nfs 安装
- dataTable一些使用方法
- Android圆形头像CircleImageView
- 好的Android开源项目
- postgres 通过 psql 来创建用户、数据库等操作
- hdoj-1532-edmondsKarp最大流算法模板
- iOS开发之自定义封装FrameWork需要的代码