diff options
author | Glavo <zjx001202@126.com> | 2019-11-29 07:29:34 +0800 |
---|---|---|
committer | Glavo <zjx001202@126.com> | 2019-11-29 07:29:34 +0800 |
commit | e8c30ce4df4fa9e9b8f559153b54dfc2616d4ebc (patch) | |
tree | 255ca3b4adf4f6a7b25ebcbdec8b8b8781af2155 /src/main/java/org/glavo/javah/Utils.java | |
parent | 4c0edeb4fc0ab85bae4bd41dfbf6a0089dfbf467 (diff) | |
download | gjavah-e8c30ce4df4fa9e9b8f559153b54dfc2616d4ebc.tar.gz gjavah-e8c30ce4df4fa9e9b8f559153b54dfc2616d4ebc.tar.bz2 gjavah-e8c30ce4df4fa9e9b8f559153b54dfc2616d4ebc.zip |
update
Diffstat (limited to 'src/main/java/org/glavo/javah/Utils.java')
-rw-r--r-- | src/main/java/org/glavo/javah/Utils.java | 87 |
1 files changed, 85 insertions, 2 deletions
diff --git a/src/main/java/org/glavo/javah/Utils.java b/src/main/java/org/glavo/javah/Utils.java index 989d348..b3554ff 100644 --- a/src/main/java/org/glavo/javah/Utils.java +++ b/src/main/java/org/glavo/javah/Utils.java @@ -1,5 +1,7 @@ package org.glavo.javah; +import org.objectweb.asm.Type; + import java.io.IOException; import java.io.InputStream; import java.nio.file.FileSystem; @@ -8,9 +10,90 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.*; import java.util.jar.Manifest; -import java.util.regex.Pattern; class Utils { + static String encode(String str) { + StringBuilder buffer = new StringBuilder(str.length()); + + int len = str.length(); + for (int i = 0; i < len; i++) { + char ch = str.charAt(i); + if (ch == '_') { + buffer.append("_1"); + } else if (ch == ';') { + buffer.append("_2"); + } else if (ch == '[') { + buffer.append("_3"); + } else if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { + buffer.append(ch); + } else { + buffer.append(String.format("_0%04x", (int) ch)); + } + } + return buffer.toString(); + } + + static String mapToNativeType(Type jt) { + switch (jt.toString()) { + case "Z": + return "jboolean"; + case "B": + return "jbyte"; + case "C": + return "jchar"; + case "S": + return "jshort"; + case "I": + return "jint"; + case "J": + return "jlong"; + case "F": + return "jfloat"; + case "D": + return "jdouble"; + case "V": + return "void"; + case "Ljava/lang/Class;": + return "jclass"; + case "Ljava/lang/String;": + return "jstring"; + case "Ljava/lang/Throwable ;": + return "jthrowable"; + case "[Z": + return "jbooleanArray"; + case "[B": + return "jbyteArray"; + case "[C": + return "jcharArray"; + case "[S": + return "jshortArray"; + case "[I": + return "jintArray"; + case "[J": + return "jlongArray"; + case "[F": + return "jfloatArray"; + case "[D": + return "jdoubleArray"; + } + + if (jt.toString().startsWith("[")) { + return "jobjectArray"; + } + + return "jobject"; + } + + static String mangledArgSignature(Type methodType) { + Objects.requireNonNull(methodType); + String str = methodType.toString(); + int idx = str.indexOf(')'); + if (idx == -1) { + throw new IllegalArgumentException(methodType.toString() + "is not a method type"); + } + return encode(str.substring(1, idx)); + } + static boolean isRegularClassName(String name) { Objects.requireNonNull(name); return !name.contains("//") @@ -58,7 +141,7 @@ class Utils { if (Files.isRegularFile(root)) { String name = root.toString().toLowerCase(); try { - FileSystem fs = FileSystems.newFileSystem(root, null); + FileSystem fs = FileSystems.newFileSystem(root, (ClassLoader) null); if (name.endsWith(".jar")) { root = fs.getPath("/"); } else if (name.endsWith(".jmod")) { |