- 定义Java本地方法
- 根据类生成头文件
- 根据头文件编写C代码实现
- 头文件解释
- 实现头文件声明的函数
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 ̄)>