PB调用JAVA

为什么需要PB调用JAVA

java使用人员众多,有丰富的生态,有各种功能的库。pb通过调用java可以极大地丰富pb的能力。比如对接国家医保时,只提供了JAVA的示例,我们通过PB调用JAVA可以极大地减少对接的工作量,快速实现对接。

通过SatJNI我们可以很容易地实现PB调用JAVA类。

PB调用JAVA的方法

我们以调用医保示例为例,说明PB调用JAVA的方法

生成ybutil.jar

创建JAVA的医保示例工程,并导入相关的示例和需要JAR,创建后如下:

PB调用JAVA

说明:其中libs中是需要用到jar库,bcp和hsaf开头的是算法和加密相关的库,其它是一些帮助类HseEncAndDecUtil是示例

创建完成后可以导出jar。不熟悉java创建工程和导出jar的同学可以参考百度方法,这里不是调用重点就不详细说明。

PB代码

我们以调用main方法中的

SM2Util.getKeyPairStr() 

为例,PB调用过程如下:

1. 首先我们下载SatJNI,里面包含了示例代码

主要函数定义在n_jvmapi中,n_jvmapi代码如下

forward
global type n_jvmapi from nonvisualobject
end type
end forward

global type n_jvmapi from nonvisualobject autoinstantiate
end type

type prototypes
Function ulong SatJVM_Create(String jarPath) library "satjni.dll"
Subroutine SatJVM_Destroy(ulong jvm) library "satjni.dll"
function Any SatJVM_Invoke(ulong jvm, ulong code, ...) system library "satjni.dll" alias for "SatJVM_Invoke"
end prototypes
type variables
//JVM
constant ulong API_InvokeStaticMethod = 2
constant ulong API_InvokeObjectMethod = 3
constant ulong API_CreateInstance = 4
constant ulong API_DestroyInstance = 5
constant ulong API_SetStaticField = 6
constant ulong API_SetObjectField = 7
constant ulong API_GetStaticField = 8
constant ulong API_GetObjectField = 9
end variables

on n_jvmapi.create
call super::create
TriggerEvent( this, "constructor" )
end on

on n_jvmapi.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on

2. 在程序open事件中初始化satjni并加载JAVA的jar或者class类的根文件夹

gl_jvm = n_api.SatJVM_Create("java;ybutil.jar")

其中java表示加载当前目录下面的java文件夹的代码,ybutil.jar是封装的医保的java库,多个文件夹或库以  号分隔

3. 通过 SatJVM_Invoke 调用JAVA的方法

调用静态方法(如调用医保的sm2生成公钥和私钥,该方法在示例中):

Any l,r
Exception lexp

l = n_api.SatJVM_Invoke(gl_jvm,n_api.API_InvokeStaticMethod,"cn.hsaf.common.algorithm.sm2.SM2Util","getKeyPairStr")
if classname(l) = "exception" then
	lexp = l
	messagebox("出错",lexp.Text)
end if

r = n_api.SatJVM_Invoke(gl_jvm,n_api.API_invokeobjectmethod,l,"toString")
messagebox("结果:"+ classname(l),string(r))

调用类实例的方法(如实例化fastjson的JSONObject对象,并调用方法):

Any l,r,jsonObj
Exception lexp

jsonObj = n_api.SatJVM_Invoke(gl_jvm,n_api.API_CreateInstance,"com.alibaba.fastjson.JSONObject")
n_api.SatJVM_Invoke(gl_jvm,n_api.API_invokeobjectmethod,jsonObj,"put","appUserId","ohNH9sgKsmJC3tR_spm9jcQx_bh")
n_api.SatJVM_Invoke(gl_jvm,n_api.API_invokeobjectmethod,jsonObj,"put","appId","ohNH9sgKsmJC3tR_spm9jcQx_bh")
n_api.SatJVM_Invoke(gl_jvm,n_api.API_invokeobjectmethod,jsonObj,"put","idNo","ohNH9sgKsmJC3tR_spm9jcQx_bh")
n_api.SatJVM_Invoke(gl_jvm,n_api.API_invokeobjectmethod,jsonObj,"put","idType","01")
n_api.SatJVM_Invoke(gl_jvm,n_api.API_invokeobjectmethod,jsonObj,"put","userName","ccccccc")
n_api.SatJVM_Invoke(gl_jvm,n_api.API_invokeobjectmethod,jsonObj,"put","authCode","11111")

r = n_api.SatJVM_Invoke(gl_jvm,n_api.API_invokeobjectmethod,jsonObj,"toString")
messagebox("结果:"+ classname(l),string(r))

4. PB效果如下:

PB调用JAVA

 

上一篇:键盘记录器,可截获到 QQ 的password


下一篇:一个简单的文件系统过滤驱动框架