三、JNI基本使用
博客专区 > unic0rn 的博客 > 博客详情
三、JNI基本使用
unic0rn 发表于1年前
三、JNI基本使用
  • 发表于 1年前
  • 阅读 25
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 本文将编写一个jni小程序,一步一步介绍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 ̄)> 

标签: jni
共有 人打赏支持
粉丝 8
博文 75
码字总数 35725
作品 1
×
unic0rn
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: