文档章节

三、JNI基本使用

unic0rn
 unic0rn
发布于 2016/07/14 16:27
字数 869
阅读 31
收藏 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
视频的「编解码」与「传输」的那些事儿

本文来自作者 Owen Chan 在 GitChat 上分享「关于视频的编解码与传输技术,你想知道的都在这里」,「阅读原文」查看交流实录 「文末高能」 编辑 | 泰龙 一、如何编译 FFmpag 准备工作 下载 ...

gitchat
2017/11/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

区块链入门教程以太坊源码分析ethdb源码分析

兄弟连区块链入门教程以太坊源码分析ethdb源码分析,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退...

兄弟连区块链入门教程
10分钟前
0
0
Eclipse下忽略掉node_modules目录相关配置

https://blog.csdn.net/yzf913214/article/details/72872523

张宏亮1982
11分钟前
0
0
在Python-dataframe中如何把出生日期转化为年龄?

我们在做数据挖掘项目或大数据竞赛时,如果个体是人的时候,获得的数据中可能有出生日期的Series,举个简单例子,比如这样的一些数: # -*- coding: utf-8 -*- import pandas as pd from ...

Mr_zebra
14分钟前
0
0
Android入门—activity生命周期

activity生命周期如下所示: onCreate()方法 创建activity时使用onStart()方法 当activity界面变为用户可见时调用onResume()方法 当activity界面获取到焦点时调用(界面按钮可点击,...

haoyuehong
16分钟前
0
0
使用C++ Builder 6编译产生错误

错误提示: [C++ Error] E2075 Incorrect project override option: Files\Borland\CBuilder6\lib\vcl60.csm[C++ Error] E2075 Incorrect project override option: Files\Borland\CBuilde......

simpower
18分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部