JNI
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。
实现步骤
以下实现步骤以RuntimeEasy API为例,描述如何通过java 调用Runtime接口
编写带有native方法的Java类
参考C代码接口,编写带有native方法的Java类,所有方法和C接口进行对应,方便调用实现。
例如C接口如下
C/C++代码段
1 2 3 4 5 6 7 |
|
转换为Java接口如下
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
使用javac工具编译Java类
上述Java类编写完成后,调用 javac命令进行编译。
javac Runtime/*.java -d .
javac是java语言编程编译器。全称javacompilation.javac工具读由java语言编写的类和接口的定义,并将它们编译成字节代码的class文件。
-d 参数是指将编译结果放在指定的目录下。
"."表示目录为java文件中包含的包目录结构层级,本例中将生产的目录结构为:./com/senseyun/openapi/SSRuntimeEasyJava。
使用javah来生成与native方法对应的头文件
javah -cp . -jni com.csenseyun.openapi.SSRuntimeEasyJava.SSRuntimeEasy
javah 生成实现本地方法所需的 C 头文件和源文件。C 程序用生成的头文件和源文件在本地源代码中引用某一对象的实例变量。详细的命令参数可自行查询。
实现C功能
生成的*.h文件可创建一个VS工程,添加对应的.c文件实现所有函数功能。
C/C++代码段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
其中实现中用于字节数组转换的函数有
GetStringUTFChars
GetCharArrayElements
等,可详细了解其使用方法后使用。
将C代码编译成动态库,在Java工程中包含此动态库,加载之前写好的java类即可试用。至此通过Java调用RuntimeEasy API的功能已经完成。
Javadoc的生成
我们使用eclipse创建Java工程师,每个用到的每个Java包中的方法,都有函数说明,被称之为Javadoc。要生成Javadoc,只需以下三步
第一步,写好java类注释
第二步,使用javadoc命令生成
第三步,在eclipse工程中导入javadoc的目录
扩展内容
Java接口和C接口中的结构体转换
java中只有类,没有结构体,要想传递结构体参数,必须用类来替换,替换方法依然是在java中创建类,通过Object类型参数将结构传递给jni,jni通过jni提供的方法转换为结构体结构
下面以RuntimeEasy接口的slm_login_easy接口为例,解释如何传递结构体参数。
ST_LOGIN_PARAM对应的Java类
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
在jni中对Java传入的object参数进行解析
C/C++代码段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
|