通过上一个系列对c语言的熟悉,为jni开发打下基础,接下来就正式进入jni开发。

JNI概念(Java Native Interface )

java本地化接口 , 可以通过JNI调用系统提供的API , 我们知道不管什么类型操作系统 , 机器最终识别的是一些二进制码。而 java和C/C++不同 , 它不会直接编译成机器码,而是编译成虚拟机可以运行的java字节码的.class文件,通过JIT技术即时编译成本地机器码,广义的说JNI就是java与c/c++世界交互的桥梁,狭义来说,jni就是一些定义了一些接口,通过调用这些接口实现java与底层的交互(指在jdk中jni.h文件)

JNI开发流程

前期简单的开发使用eclipse+visual studio2013 也可以选择android studio 2.2版本
我使用的是as2.1代码提示效果很差,基本是靠手写
1.编写java native方法

从显示hello world开始

public static native String helloWorld() ;

2.生成.h文件
这个.h文件不是非必需的,h头文件只是一个提示作用,方面其他开发人员知道有哪些方法,然后使用。android studio 2.2编写的时候直接就创建jni方法,没有生成.h文件。
生成的方法可以使用javah命令完成,也可以在idea配置快捷方式生成,android studio快捷方式生成配置请看 android studio配置Javah 和ndk-build

下面是javah命令生成:

> cd  D:\workspace\JNIDemo\src
> javah com.honjane.jni.HelloJni
# 注意 com.honjane.jni.HelloJni , 是全类名, 包名.类名

3.将.h头文件复制项目对应的jni目录下,实现头文件
新建一个xx.c或者xx.cpp文件,看你个人习惯c语法还是c++语法

// 生成的头文件函数
/** Class:     com_honjane_jni_HelloJni* Method:    helloWorld* Signature: ()Ljava/lang/String;*/
JNIEXPORT jstring JNICALL Java_com_honjane_jni_HelloJni_helloWorld(JNIEnv *env, jclass jclasz){return (*Env)->NewStringUTF(Env, "hello JNI ");
}

4.生成动态链接库

动态库 常见的有2种,windos(.dll) linux(.so)
* 动态库把对一些库函数的链接载入推迟到程序运行的时期。
* 可以实现进程之间的资源共享。动态库也称为共享库
* 可以动态注入到程序中

静态库 同动态库一样有2种格式windos(.lib) linux(.a)
* 对函数库的链接是放在编译时期完成的。
* 程序在运行时与函数库再无瓜葛,移植方便。
* 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。

as2.2或者eclipse生成动态库就很简单配置好环境后直接build就可以生成相应的so
我用的as2.1可以查看这篇文章编译生成so android studio配置Javah 和ndk-build

5.加载动态链接库

static{System.loadLibrary("JNI") ;}

6. 调用本地方法并执行

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Example of a call to a native methodTextView tv = (TextView) findViewById(R.id.sample_text);tv.setText(helloWorld());}public static native String helloWorld() ;static {System.loadLibrary("hellojni");}
}

[JNI] 开发之旅 (1)开发流程介绍相关推荐

  1. imageJ二次开发之旅 – imageJ开源项目介绍

    imageJ二次开发之旅 – imageJ开源项目介绍 imageJ起源: imageJ项目最初是由NIH(NationalInstitutes of Health,美国国家卫生研究院)在1997发起 ...

  2. Simulink HDL Coder FPGA开发实践之 基本使用流程介绍

    前言: 本栏目除特别说明以外,均采用的黑金AX7103开发板,该开发板时钟频率为200M,并且是双端时钟,因此在每个项目中都有一段原语将双端时钟变成200MHz的单端时钟.文章仅作为学习记录,如有不足 ...

  3. Linux下PHP开发之旅-2.开发环境相关设置探索

    一.默认目录在哪儿? 开始时面对该xampp集成开发环境的相关配置有点不知所错,于是便先想着找httpd.conf,通过该文件,对该集成环境的配置文件关系有了大致了解,具体操作如下; cd /opt/ ...

  4. Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发

    Android NDK开发之旅(2):一篇文章搞定android Studio中使用CMake进行NDK/JNI开发 (码字不易,转载请声明出处:http://blog.csdn.NET/andrex ...

  5. 微信小程序开发的完整流程介绍,新手必读

    自从跳一跳小程序游戏出现后,一夜之间,小程序就变得家喻户晓了,功能开发也越来越丰富,在微信搜一搜就会发现许多大品牌早已有自己的小程序了,越来越多的企业和商家都看中了这个风口,想快速开发出一款属于自己的 ...

  6. typecho和wordpress模板了解、开发流程介绍、前台后台前端后端区分

    网站模板搭建网站: 使用网站模板搭建网站很简单,只需要将相关文件放到你自己的服务器上面,之后在进行相关的配置即可.这里给大家介绍两款网站模板: typecho: 是一个轻量高效,简单操作就能搭建网站的 ...

  7. 基于人人网的Android开发流程介绍

    人人网(www.renren.com)前身为校内网,是中国最大.最受用户欢迎的网络SNS平台.人人网目前针对不同领域的开发者,提供了相应的教程和文档,目前主要分为"站内应用开发". ...

  8. OpenGL开发之旅基础知识介绍

    最近由于手机项目中需要用到OpenGL ES的知识,所以这段时间正在研究OpenGL的相关知识.因为OpenGL ES是OpenGL的剪裁版本,所以我直接从OpenGL入手,然后再去看OpenGL E ...

  9. (2)FPGA开发流程介绍(第1天)

    (2)FPGA开发流程介绍(第1天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)FPGA开发流程介绍(第1天) 5)技术交流 6)参考资料 2 FPGA初级课 ...

  10. 安卓 camera 调用流程_音视频开发之旅(四)Camera视频采集

    目录 Camera基础知识 视频采集的流程 遇到的问题和常见的坑(重点) 收获 一. Camera基础知识 Camera 有几个重要的基础概念. facing相机的方向,一般后置摄像头和前置摄像头. ...

最新文章

  1. apply plugin: 'idea' --- gradle idea
  2. 天翼云从业认证课后习题(第四章云场景化解决方案综合应用)
  3. System Center 2012 R2实例2—构建Azure Pack云10—租户RM
  4. VTK:PolyData之Casting
  5. Redis中布隆过滤器的使用及原理
  6. 推荐一个不错的 Chrome 插件,百变皮肤,还可以去广告
  7. python个人网站系统_利用基于Python的Pelican打造一个自己的个人纯静态网站
  8. RHEL网络设置,来自于hyper-v中的虚拟机
  9. 每月读书 2012-06
  10. 在几何画板中如何制作圆柱的侧面展开动画_几何画板制作圆柱体的形成动画演示方法...
  11. uni-app和H5页面使用支付宝登陆问题解决
  12. vue项目在ie浏览器下运行显示空白页面
  13. 离散题目9(判断是否为单射函数)
  14. 自己忙碌十年,发现空空的,该填满了
  15. 独立样本t检验及其在SPSS中的实现
  16. 高数 微分的几何意义
  17. C语言int 类型的表示范围 sizeof()函数
  18. http系列之-核心内容
  19. linux进程管理杂记(1)
  20. 液晶显示器c语言编程,51驱动1602液晶显示器c程序

热门文章

  1. oracle ebs 接收数量,[zz]Oracle EBS API: 库存数量查询API示例
  2. 常用集合(ArrayList、Hashset、HashMap)的用法(会一直更新)
  3. python 设置请求时间间隔_如何自学Python爬虫?新手入门教程
  4. android接收红外传感器发送的脉冲信号,怎么判断红外发送和接收管?
  5. DTP模型之一:(XA协议之一)XA协议、二阶段2PC、三阶段3PC提交
  6. sqoop的job工具
  7. 乒乓球(Table Tennis)
  8. Java final关键字详解
  9. Java FX swt_转: JAVA_SWT常用事件, 和方法
  10. Redis集群环境下分布式锁方案-RedLock算法