三、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 ̄)> 

转载于:https://my.oschina.net/souljava/blog/711834

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值