# java 库模块帮助文档

[📄 aardio + Java 开发指南](https://www.aardio.com/zh-cn/docs/library-guide/std/java/_.html)

## java 成员列表 <a id="java" href="#java">&#x23;</a>

创建 JAVA 虚拟机,仅支持 32 位 JRE。  
改用 java.openProcess  函数可兼容 32位、64位 JRE。  
如果未找到可用的 JVM 运行库返回 null  
在每个进程第一次创建JAVA 虚拟机或初始化 JVM 路径之前,  
可调用 java.path.setJreHome 自定义搜索 JVM 的 JRE 运行时目录,  
jar包搜索顺序为"\","\java\","~\java",  
可使用 java.addClassPath 函数添加搜索路径

### java() <a id="java()" href="#java()">&#x23;</a>
[返回对象:javaObject](#javaObject)

### java(命令行参数,...) <a id="java(命令行参数,...)" href="#java(命令行参数,...)">&#x23;</a>
n可指定一个或多个启动命令行参数,  
也可以把多个参数写到一个字符串参数或数组参数里,  

参数类似 "-D<propertyName>=value"  
在 JAVA 中可以使用 System.getProperty("propertyName") 得到value的值  

对于每个打开的进程,JAVA虚拟机仅创建一次实例,  
因此所有参数、搜索路径等仅在首次创建虚拟机时生效

### java.addClassPath() <a id="java.addClassPath" href="#java.addClassPath">&#x23;</a>
添加一个或多个查找类的根目录。  
添加该目录时将自动添加该目录下已存在的 *.jar 文件  
子目录下的 jar 文件将被忽略。  

此函数成功返回 true，失败返回 false。  
必须在进程首次创建 Java 虚拟机或创建其他 Java 进程之前调用此函数才会有效，  
否则无效并且函数会返回 false 。

### java.addLibPath() <a id="java.addLibPath" href="#java.addLibPath">&#x23;</a>
添加一个或多个目录  
 Java 中调用 System.loadLibrary 时将在指定的目录查找 DLL 组件

### java.compile("java源文件路径") <a id="java.compile" href="#java.compile">&#x23;</a>
编译 Java源 文件。  
此函数需要系统安装 JDK,可事先设置 JAVA_HOM E环境变量手动指定 JDK 位置。  
可导入 java.jdk.v8 等支持库按需下载并设置 JDK 环境。  
注意低版本 JDK 编译的 class 通常可以在高版本 JRE 下运行，  
反过来不行。

### java.compile() <a id="java.compile" href="#java.compile">&#x23;</a>
[返回对象:processPopenObject](https://www.aardio.com/zh-cn/docs/library-reference/process/popen.html#processPopenObject)

### java.encoding <a id="java.encoding" href="#java.encoding">&#x23;</a>
指定默认编码,  
默认值为 "utf-8",  
UTF-8 目前是最好也是最通用的设置,  
最好不要改也不必要改

### java.jar("/java","-cvf","test.jar","aardio") <a id="java.jar" href="#java.jar">&#x23;</a>
执行 jar.exe 打包 jar 文件，返回 process.popen 对象。  
参数 @1 指定 jar 命令的工作目录。  
其他参数指定命令行参数（可以是数组或任意个文本参数）。  
如果命令行参数有多个,则包含空格的参数添加必要的双引号和转义。  

。  
此函数需要系统安装 JDK,可事先设置 JAVA_HOM E环境变量手动指定 JDK 位置。  
可导入 java.jdk.v8 等支持库按需下载并设置 JDK 环境。

### java.jar() <a id="java.jar" href="#java.jar">&#x23;</a>
[返回对象:processPopenObject](https://www.aardio.com/zh-cn/docs/library-reference/process/popen.html#processPopenObject)

### java.openProcess("-jar","命令行参数", ... ) <a id="java.openProcess" href="#java.openProcess">&#x23;</a>
创建 Java 窗口应用程序返回process进程对象  
命令行参数可以是数组或任意个文本参数,  
如果命令行参数有多个,则包含空格的参数添加必要的双引号和转义,  
如果参数@1是数组,  
参数@2可指定 process.STARTUPINFO 结构体或部分字段,  
规则考 process 构造函数

### java.openProcess() <a id="java.openProcess" href="#java.openProcess">&#x23;</a>
[返回对象:processObject](https://www.aardio.com/zh-cn/docs/library-reference/process/_.html#processObject)

### java.popenProcess("-jar","命令行参数", ... ) <a id="java.popenProcess" href="#java.popenProcess">&#x23;</a>
创建 Java 控制台应用程序返回 process.popen 对象  
命令行参数可以是数组或任意个文本参数,  
如果命令行参数有多个,则包含空格的参数添加必要的双引号和转义,  
如果参数@1是数组,  
参数@2可指定 process.STARTUPINFO 结构体或部分字段,  
规则考 process 构造函数

### java.popenProcess() <a id="java.popenProcess" href="#java.popenProcess">&#x23;</a>
[返回对象:processPopenObject](https://www.aardio.com/zh-cn/docs/library-reference/process/popen.html#processPopenObject)

### java.runtimeVersion(true) <a id="java.runtimeVersion" href="#java.runtimeVersion">&#x23;</a>
返回 Java 运行时版号，数值。  
版本号为 1.x 时返回第 2 位版本号，否则返回第 1 位版本号（Java 9 以上）。  
如果不指定参数，则返回字符串格式的完整版本号。

### java.version <a id="java.version" href="#java.version">&#x23;</a>
JVM 虚拟机接口版本,  
在进程首次创建虚拟机以前用于指定最低兼容版本  
默认会设为 0x10006/*_JNI_VERSION_1_6*/

## javaObject 成员列表 <a id="javaObject" href="#javaObject">&#x23;</a>

### javaObject.addClassLoaderUrl <a id="javaObject.addClassLoaderUrl" href="#javaObject.addClassLoaderUrl">&#x23;</a>
添加类搜索目录到 CLASSPATH,  
此函数仅支持 Java6~Java8   
Java9 开始不再支持,可以改用 java.addClassPath,  
但 java.addClassPath 仅支持 ANSI编码路径,  
addClassLoaderUrl 函数支持 UTF-8 编码路径

### javaObject.addClassLoaderUrl("类搜索路径") <a id="javaObject.addClassLoaderUrl" href="#javaObject.addClassLoaderUrl">&#x23;</a>
添加jar包或文件目录到 CLASSPATH,  
Java 在 CLASSPATH 指定的目录或 jar 中搜索类,  
参数可以是一个数组,也可以是多个路径参数

### javaObject.array("int",) <a id="javaObject.array" href="#javaObject.array">&#x23;</a>
将一个或多个基本类型转换为java数组对象  
传入参数也可以是一个table类型字符串数组

### javaObject.buffer() <a id="javaObject.buffer" href="#javaObject.buffer">&#x23;</a>
创建 Java 字节数组，返回 Java 对象（java.object）。  
参数可指定 aardio 的字节串（ buffer 类型）或字符串对象。

### javaObject.byte() <a id="javaObject.byte" href="#javaObject.byte">&#x23;</a>
创建 8 位整型数值，返回 Java 对象（java.object）。

### javaObject.char() <a id="javaObject.char" href="#javaObject.char">&#x23;</a>
创建 16 位无符号整型数值（java.lang.Character），返回 Java 对象（java.object）。

### javaObject.date() <a id="javaObject.date" href="#javaObject.date">&#x23;</a>
创建 java.util.Date 对象，返回 Java 对象（java.object）。  
参数可指定时间戳或 time,time.ole 对象。  
不指定参数时获取当前时间戳作为参数。  

在 aardio 中调用 Java 函数时，time,time.ole 对象会自动转换为 java.util.Date。  
Java 返回的 java.util.Date 也会自动转换为 aardio 的 time 对象。

### javaObject.double() <a id="javaObject.double" href="#javaObject.double">&#x23;</a>
创建 64 位浮点数值，返回 Java 对象（java.object）。

### javaObject.exceptionClear() <a id="javaObject.exceptionClear" href="#javaObject.exceptionClear">&#x23;</a>
该函数如果检测到抛出的异常,并清除异常返回true  
如果未检测到异常返回空值

### javaObject.fieldExists(Java对象,"字段名") <a id="javaObject.fieldExists" href="#javaObject.fieldExists">&#x23;</a>
返回是否存在指定字段名

### javaObject.float() <a id="javaObject.float" href="#javaObject.float">&#x23;</a>
创建 32 位浮点数值，返回 Java 对象（java.object）。

### javaObject.getFieldValue(Java对象,"字段名") <a id="javaObject.getFieldValue" href="#javaObject.getFieldValue">&#x23;</a>
返回字段值

### javaObject.hashMap() <a id="javaObject.hashMap" href="#javaObject.hashMap">&#x23;</a>
创建 java.util.HashMap 对象，返回 Java 对象（java.object）。  
参数可指定普通的 aardio 表对象。  

注意：在调用 java 函数时，  
除 java.object,纯数组,类数组,时间对象以外的表  
也会自动转换为 java.util.HashMap 对象。  
但 Java 返回的 HashMap 不会自动转换为 aardio 表，  
需要显式调用 java 对象的 parseValue 才会转换为 aardio 表。

### javaObject.import <a id="javaObject.import" href="#javaObject.import">&#x23;</a>
导入并返回 Java 类。

### javaObject.import("类名","类文件路径") <a id="javaObject.import" href="#javaObject.import">&#x23;</a>
导入 Java 类。  
可选用参数 @2 指定 *.class 文件路径（或指定文件数据并内存加载类）。  
导入成功则返回值为导入的 Java 类，可使用返回的类直接构造 Java 对象。  
如果类不存在或加载失败返回 null 空值 - 不会抛出异常。  

注意此函数需要通过返回值接收导入的 Java 类，  
并不会像 dotNet.import 那样自动导入外部命名空间。

### javaObject.import() <a id="javaObject.import" href="#javaObject.import">&#x23;</a>
[返回对象:JavaClassObject](#JavaClassObject)

### javaObject.int() <a id="javaObject.int" href="#javaObject.int">&#x23;</a>
创建 32 位整型数值，返回 Java 对象（java.object）。

### javaObject.interop <a id="javaObject.interop" href="#javaObject.interop">&#x23;</a>
aardio.interopServices.utility类

### javaObject.invokeMethod(类或对象,其他调用参数...) <a id="javaObject.invokeMethod" href="#javaObject.invokeMethod">&#x23;</a>
调用Java函数,支持多个参数  
对于数值类型,aardio将会自动检测适用的数值类型  
也可以调用java.int,java.short,java.char,java.long等函数显式的声明数值类型

### javaObject.isMainThread <a id="javaObject.isMainThread" href="#javaObject.isMainThread">&#x23;</a>
仅第一次创建java虚拟机时该值为true,  
随后创建的虚拟机都会返回false

### javaObject.loadFileObject() <a id="javaObject.loadFileObject" href="#javaObject.loadFileObject">&#x23;</a>
自参数 @1 指定的文件路径反序化化 Java 对象

### javaObject.long() <a id="javaObject.long" href="#javaObject.long">&#x23;</a>
创建 64 位整型数值，返回 Java 对象（java.object）。

创建 64 位整型数值，返回 Java 对象（java.object）。

### javaObject.new(java类对象,...) <a id="javaObject.new" href="#javaObject.new">&#x23;</a>
调用构造函数创建对象

### javaObject.object2Number() <a id="javaObject.object2Number" href="#javaObject.object2Number">&#x23;</a>
java数值对象转换为 aardio 数值

### javaObject.object2String() <a id="javaObject.object2String" href="#javaObject.object2String">&#x23;</a>
java字等串对象转换为 aardio 字符串

### javaObject.objectIsNumber() <a id="javaObject.objectIsNumber" href="#javaObject.objectIsNumber">&#x23;</a>
返回参数指定的Java对象是否数值

### javaObject.objectIsString() <a id="javaObject.objectIsString" href="#javaObject.objectIsString">&#x23;</a>
返回参数指定的Java对象是否字符串

### javaObject.parseArray("int",java数组) <a id="javaObject.parseArray" href="#javaObject.parseArray">&#x23;</a>
将 Java 对象指针转换为 aardio 数组对象,参数一指定数组元素数据类型  
注意:该函数会销毁传入的 Java 对象指针

### javaObject.parseObject(jobject) <a id="javaObject.parseObject" href="#javaObject.parseObject">&#x23;</a>
将参数指定的 jobject 指针转换为 java.object 对象。  
支持转换的对象可调用 java.object 对象 parseValue 方法转换为纯 aardio 值。

### javaObject.parseString() <a id="javaObject.parseString" href="#javaObject.parseString">&#x23;</a>
将 Java 字符串转换为 aardio 字符串。  
注意:该函数会销毁传入的 Java 对象指针

### javaObject.parseStringArray(java数组) <a id="javaObject.parseStringArray" href="#javaObject.parseStringArray">&#x23;</a>
将 Java 对象指针转换为 aardio 数组对象  
注意:该函数会销毁传入的 Java 对象指针

### javaObject.reopen("setErr","conerr$") <a id="javaObject.reopen" href="#javaObject.reopen">&#x23;</a>
重定向错误输出到控制台

### javaObject.reopen("setOut","conout$") <a id="javaObject.reopen" href="#javaObject.reopen">&#x23;</a>
重定向标准输出到控制台,  
如果在创建 Java 虚拟机以后打开控制台,  
需要调用此函数才能在控制台看到 Java 的标准输出

### javaObject.setFieldValue(Java对象,"字段名",字段值) <a id="javaObject.setFieldValue" href="#javaObject.setFieldValue">&#x23;</a>
修改字段值

### javaObject.short() <a id="javaObject.short" href="#javaObject.short">&#x23;</a>
创建 16 位整型数值，返回 Java 对象（java.object）。

### javaObject.string() <a id="javaObject.string" href="#javaObject.string">&#x23;</a>
将aardio字符串转换为java字符串对象  
返回对象指针

### javaObject.stringArray() <a id="javaObject.stringArray" href="#javaObject.stringArray">&#x23;</a>
将一个或多个字符串转换为java字符串数组  
传入参数也可以是一个table类型字符串数组

### javaObject.version <a id="javaObject.version" href="#javaObject.version">&#x23;</a>
JVM 虚拟机接口版本,  
Java 8 的接口版本为 0x10008/*_JNI_VERSION_1_8*/,  
目前 Java 10+ 的接口版本号都是 0xa0000/*JNI_VERSION_10*/

## 全局对象 成员列表 <a id="global" href="#global">&#x23;</a>

### jar2 <a id="jar2" href="#jar2">&#x23;</a>
调用 java.jar 函数打包 jar 文件。  
此函数等待打包完成并返回打包成功的文件路径（已转为完整路径）。  
失败返回 null,错误信息。

### jar2(workDir,classDir,jarPath) <a id="jar2(workDir,classDir,jarPath)" href="#jar2(workDir,classDir,jarPath)">&#x23;</a>
- 参数 @workDir 指定 jar 命令的工作目录。  
- 参数 @classDir 指定要打包的类目录，必须是相对于 @workDir 的目录路径。  
- 参数 @jarPath 指定输出的 jar 路径。  
此函数会自动将 @jarPath 转为完整路径（并非相对于 @workDir 的路径）

## JavaClass()Object 成员列表 <a id="JavaClass()Object" href="#JavaClass()Object">&#x23;</a>

[返回对象:JavaObject](#JavaObject)

## JavaClassObject 成员列表 <a id="JavaClassObject" href="#JavaClassObject">&#x23;</a>

### JavaClassObject.* <a id="JavaClassObject.any" href="#JavaClassObject.any">&#x23;</a>
Java 类的静态属性或方法。

### JavaClassObject.getField("字段名","int") <a id="JavaClassObject.getField" href="#JavaClassObject.getField">&#x23;</a>
参数 @2 指定字段类型声明  
与函数原型使用的语法一致

### JavaClassObject.getMethod("函数名","int(int)") <a id="JavaClassObject.getMethod("函数名","int" href="#JavaClassObject.getMethod("函数名","int">&#x23;</a>
返回 Java 类的静态成员函数。  
参数 @2 指定[函数签名](https://www.aardio.com/zh-cn/docs/library-guide/std/java/_.html#signature)。  

不需要调用 getMethod 也可以直接调用类的静态成员函数。  
但指定签名可以直接获取指定函数并省略了自动匹配过程。

### JavaClassObject.new(...) <a id="JavaClassObject.new" href="#JavaClassObject.new">&#x23;</a>
使用 Java 调用构造函数创建对象，可指定不定个数的参数。  
new 方法是类的默认方法可以省略不写直接用 Java 类构造 Java 对象。  

改用 new2 函数构造对象可以用第 1 个参数显式指定构造函数签名。

### JavaClassObject.new2("void()"...) <a id="JavaClassObject.new2("void" href="#JavaClassObject.new2("void">&#x23;</a>
使用 JNI 调用构造函数创建对象。  
参数 @1 指定[构造函数签名](https://www.aardio.com/zh-cn/docs/library-guide/std/java/_.html#signature)，签名里的返回值必须指定为 void 类型。  
参数 @2 开始可指定不定个数的构造参数（new2 名字后面的 2 指示这一要点）。  
此函数的实际返回值为构造的 Java 实例对象（不用管签名里的返回值）。  

使用类的 new 方法也可以构造 Java 对象。  
并且可以省略 new 是默认方法名可以省略，可直接用 Java 类构造 Java 对象。

### JavaClassObject.new2() <a id="JavaClassObject.new2" href="#JavaClassObject.new2">&#x23;</a>
[返回对象:JavaObject](#JavaObject)

### JavaClassObject.registerNative(函数,函数名,签名) <a id="JavaClassObject.registerNative" href="#JavaClassObject.registerNative">&#x23;</a>

```aardio
JavaClassObject.registerNative(  
	function(env,jobject,jstring){  
		var str = owner.parseString(jstring)  

		return owner.string( func() )  
	},"/*函数名*/","string(string)"  
)
```

### JavaClassObject.unregisterNatives() <a id="JavaClassObject.unregisterNatives" href="#JavaClassObject.unregisterNatives">&#x23;</a>
注销所有注册到 Java 类中的函数

## JavaObject 成员列表 <a id="JavaObject" href="#JavaObject">&#x23;</a>

### JavaObject.getField("字段名","int") <a id="JavaObject.getField" href="#JavaObject.getField">&#x23;</a>
第二个参数指定字段类型声明。  
与函数[函数签名](https://www.aardio.com/zh-cn/docs/library-guide/std/java/_.html#signature)支持的类型相同。

### JavaObject.getMethod("函数名","int(int)") <a id="JavaObject.getMethod("函数名","int" href="#JavaObject.getMethod("函数名","int">&#x23;</a>
返回 Java 对象的成员函数。  
参数 @2 指定[函数签名](https://www.aardio.com/zh-cn/docs/library-guide/std/java/_.html#signature)。  
省略签名则默认设为 `"void()"`。  
注意 Java 区分大小写，返回的函数支持任意个数参数。  

不需要调用 getMethod 也可以直接调用类的静态成员函数。  
但指定签名可以直接获取指定函数并省略了自动匹配过程。

### 自动完成常量
_JNI_FALSE=0  
_JNI_TRUE=1  
_JNI_VERSION_10=0xA0000  
_JNI_VERSION_11=0xB0000  
_JNI_VERSION_12=0xC0000  
_JNI_VERSION_13=0xD0000  
_JNI_VERSION_14=0xE0000  
_JNI_VERSION_15=0xF0000  
_JNI_VERSION_1_1=0x10001  
_JNI_VERSION_1_2=0x10002  
_JNI_VERSION_1_4=0x10004  
_JNI_VERSION_1_6=0x10006  
_JNI_VERSION_1_7=0x10007  
_JNI_VERSION_1_8=0x10008  
_JNI_VERSION_9=0x90000  
