文档章节

三、JNI基本使用

unic0rn
 unic0rn
发布于 2016/07/14 16:27
字数 869
阅读 29
收藏 1
点赞 0
评论 0
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
泉州
项目经理
JNI使用规范

一、 JNI概述 JavaNative Interface的缩写,中文为Java本地调用。从Java1.1开始,JNI即成为Java标准的一部分。 JNI设计的目的是为了允许Java代码与其他语言进行交互。但这样做通常会导致丧失...

云颖 ⋅ 2013/12/03 ⋅ 0

Android JNI学习(四)——JNI的常用方法的中文API

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

隔壁老李头 ⋅ 05/09 ⋅ 0

NDK开发中这些基本知识你都懂吗

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

codeGoogle ⋅ 2017/09/21 ⋅ 0

欢迎进入阿钟的博客导航——快速查找所有博客

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

a_zhon ⋅ 2016/08/25 ⋅ 0

Android平台上的JNI技术介绍

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

ChowJames ⋅ 2012/10/01 ⋅ 0

视频的「编解码」与「传输」的那些事儿

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

gitchat ⋅ 2017/11/24 ⋅ 0

Android NDK开发之Jni的数据类型

在前面的一篇博客《Android NDK开发简介》,我简单地说明了Android NDK开发的流程,以及其重要的一环:JNI层得开发。今天我再详细说明一下自己的学习经验。 JNI是Java代码和C/C++代码通信的桥...

zhiweiofli ⋅ 2013/03/15 ⋅ 0

Android JNI(一)——NDK与JNI基础

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

隔壁老李头 ⋅ 05/09 ⋅ 0

Android深入理解JNI(二)类型转换、方法签名和JNIEnv

相关文章 Android深入理解JNI系列 前言 上一篇文章介绍了JNI的基本原理和注册,这一篇接着带领大家来学习JNI的数据类型转换、方法签名和JNIEnv。 1.数据类型的转换 首先给出上一篇文章中and...

刘望舒 ⋅ 2017/07/03 ⋅ 0

NDK开发笔记—ndk环境安装及其搭建

ndk环境安装及其搭建 软件下载 链接:pan.baidu.com/s/1cev9FK 密码:7yab 当然其他版本的也可以,建议不要用最新的 注意:执行Javah的时候生成头文件是对Java文件所生成的.class进行处理的命...

codeGoogle ⋅ 2017/09/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringBoot集成Druid的最简单的小示例

参考网页 https://blog.csdn.net/king_is_everyone/article/details/53098350 建立maven工程 Pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM......

karma123 ⋅ 54分钟前 ⋅ 0

Java虚拟机基本结构的简单记忆

Java堆:一般是放置实例化的对象的地方,堆分新生代和老年代空间,不断未被回收的对象越老,被放入老年代空间。分配最大堆空间:-Xmx 分配初始堆空间:-Xms,分配新生代空间:-Xmn,新生代的大小一...

算法之名 ⋅ 今天 ⋅ 0

OSChina 周日乱弹 —— 这么好的姑娘都不要了啊

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @TigaPile :分享曾惜的单曲《讲真的》 《讲真的》- 曾惜 手机党少年们想听歌,请使劲儿戳(这里) @首席搬砖工程师 :怎样约女孩子出来吃饭,...

小小编辑 ⋅ 今天 ⋅ 7

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部