文档章节

三、JNI基本使用

unic0rn
 unic0rn
发布于 2016/07/14 16:27
字数 869
阅读 32
收藏 1
jni
  1. 定义Java本地方法
  2. 根据类生成头文件
  3. 根据头文件编写C代码实现
    1. 头文件解释
    2. 实现头文件声明的函数

 

 1、定义Java本地方法

 

        在类中声明一个方法,不需要实现,将方法加上native关键字表示此方法为本地方法

 

 2、根据类生成头文件

 

        可以使用两种方式,根据个人情况选择(最后都是调用javah):

           

         1)使用javah命令生成头文件

                javah不能对.java文件生成头文件,而是要对.class文件生成头文件

        例如当前类为qrsoft.sk818sdk.Test,磁盘位置为d:\qrsoft\sk818sdk\Test.class

        cmd进入d盘,输入命令 javah qrsoft.sk818sdk.Test 将在d盘下生成头文件qrsoft_sk818sdk_Test.h

        到此使用javah命令成功!注意操作细节,与本描述一致不会出错。

 

        2)在eclipse中配置javah命令快速生成头文件

                使用javah命令生成头文件过于繁琐,如果使用eclipse开发java,可以在eclipse中配置javah命令,一键生成头文件。

        配置如下,eclipse打开菜单 run->External Tools->External Tool Configurations...

 

打开了配置窗口后,在左边Program右键菜单点击菜单项new,配置如下:

Location为javah的位置,javah位置在jdk的bin里

Working Dicectory为照填${project_loc}/src

Arguments由于我是maven工程所以填

-classpath ${project_loc}/target/classes -d ${project_loc}/jni -jni ${java_type_name}

如果是普通java工程,要查看这个工程编译后是生成class在哪里(maven是在/target/classes),然后这个目录替换掉/target/classes

 

接下来,如何使用?

在Project Explorer中选中你要生成头文件的类,点击如图的javah,即可生成头文件在此工程的jni文件夹,如果没有请右键刷新此工程

 

 

3、根据头文件编写C代码实现

    

        1)头文件解释

        生成的头文件里包含了函数声明,根据这些函数声明编写对应的C代码实现就能实现Java调用C的效果。

你可以把这个头文件导入你的VS C语言工程,开始进行JNI的开发。

如上图,头文件全部都是函数声明,但是与普通的C语言函数声明不太一样,因为它是遵守JNI的规范来声明的。

例如函数声明:

    JNIEXPORT jboolean JNICALL Java_qrsoft_sk818sdk_SK818SDKAPI_destroy(JNIEnv *, jobject);

 

解释: 

 

JNIEXPORT:表示这是一个JNI DLL导出函数

 

jboolean:表示返回值的数据类型(看起来不像是java的数据类型,也不是c的数据类型,这是因为jni有自己一套数据类型)

 

JNICALL:JNI调用约定

 

方法名Java_qrsoft_sk818sdk_SK818SDKAPI_destroy:方法名是有规律的,前缀固定是Java,后面跟的qrsoft_sk818sdk表示类的包名,SK818SDKAPI是类名,destroy是java中真正的方法名

 

(JNIEnv *, jobject):每一个JNI函数都会有这个参数,即使java中是无参数的。如果java中有一个参数,那么就会变成(JNIEnv *, jobject,int),JNIEnv *和jobject固定是前两个参数

 

     2)实现头文件声明的函数

  • 创建.c或.cpp文件
  • include上面那个头文件
  • 把头文件的函数声明拷贝到.c文件
  • 为形参都补上参数名称
  • include jni.h头文件(在jdk下的include文件夹)
  • 着手开发!

加我QQ:981656164,共同学习交流,记得备注 —— OSC!  ~~ <( ̄3 ̄)> 

© 著作权归作者所有

共有 人打赏支持
unic0rn
粉丝 8
博文 76
码字总数 36275
作品 1
泉州
项目经理
私信 提问
Android JNI学习(四)——JNI的常用方法的中文API

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
05/09
0
0
NDK开发中这些基本知识你都懂吗

JNIEnv 定义: 相当于一个jni上下文对象。 作用: 通过JNIEnv的指针能够对Java端的代码进行操作: a.创建Java对象. jstring str = (env).NewStringUTF("终端研发部"); jclass jclazz = (env)...

codeGoogle
2017/09/21
0
0
欢迎进入阿钟的博客导航——快速查找所有博客

世上最遥远的距离,是我在if里你在else里,似乎一直相伴又永远分离;世界上最痴心的等待,是我当case你是switch,或许永远都选不上自己;世界上最真情的相依,是你在try我在catch。无论你发神...

a_zhon
2016/08/25
0
0
JNI Crash:异常定位与捕获处理

关键词:JNI Crash,异常检测,信号量捕获 在Android JNI开发中,经常会遇到JNI崩溃的问题,尤其带代码量大,或者嵌入了第三方代码的情况下,很难进行问题定位和处理。本文将介绍两种常见的J...

JackMeGo
07/06
0
0
Android平台上的JNI技术介绍

NDK简介 Android是由Google领导开发的操作系统,Android依靠其开放性,迅速普及,成为目前最流行的智能手机操作系统。 图0-1 Android系统架构图 图0-1是Android系统架构图。大多数程序位于最...

ChowJames
2012/10/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在Angular中使用better-scroll插件

由于需要在一个固定的的高度做无限滚动,本来css的overflow-y也可以完成的,奈何安卓不是很流畅,还很生硬,就是用了第三方库better-scroll,配合angular的ng-content。angular的ng-content和...

前端攻城老湿
12分钟前
2
0
Js中apply和Math.max()函数的问题及区别

这篇文章主要介绍了js中apply和Math.max()函数的问题,本文给大家带来两种答案,每一种答案给大家介绍的非常详细,在文章底部给大家提到了js中Math.max.apply和Math.max的区别,写的十分的全...

前端攻城小牛
12分钟前
2
0
解决 SpringBoot 不继承父starter-parent打包不包含依赖的问题

由于项目需要继承自己平台的父 parent , 有的模块是纯 api ,不能有任何依赖, 所以父 parent 不能直接引入 springboot, 单独给非 boot 项目排除依赖的话又特别的麻烦, 且不好把控。 记得刚接触...

stys35
14分钟前
1
0
vuex进阶知识点巩固

我们先回忆一下上一篇的代码 computed:{ getName(){ return this.$store.state.name }} 这里假设现在逻辑有变,我们最终期望得到的数据(getName),是基于 this.$store.state.na...

嫣然丫丫丫
29分钟前
1
0
Python出现安全策略问题的解决方法

Python运行期间出现如下错误 import: attempt to perform an operation not allowed by the security policy `PS' @ error/constitute.c/IsCoderAuthorized/408. 解决方法:在脚本的开头添加......

大糊涂
37分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部