Ihar Hancharenka 5dff80e88e first
2023-03-27 16:52:17 +03:00

180 строки
6.9 KiB
Plaintext

https://github.com/bytedeco/javacpp/issues/261
https://groups.google.com/forum/#!topic/javacpp-project/H297oJCl3WM
@StdString
@StdWString
sizeof(wchar_t) == 4
-fshort-wchar is problematic (for wcslen and other functions)
https://www.gamedev.net/forums/topic/403700-g-with-short-wchar_t-and-stdwstring/
https://github.com/bytedeco/javacpp/issues/200
static const char* JavaCPP_classNames[18] = {
"org/bytedeco/javacpp/Loader",
"org/bytedeco/javacpp/Pointer",
"org/bytedeco/javacpp/BytePointer",
"org/bytedeco/javacpp/ShortPointer",
"org/bytedeco/javacpp/IntPointer",
"org/bytedeco/javacpp/LongPointer",
"org/bytedeco/javacpp/FloatPointer",
"org/bytedeco/javacpp/DoublePointer",
"org/bytedeco/javacpp/CharPointer", // idx = 8
"org/bytedeco/javacpp/PointerPointer",
"org/bytedeco/javacpp/BoolPointer",
"org/bytedeco/javacpp/CLongPointer",
"org/bytedeco/javacpp/SizeTPointer",
"java/lang/String",
"org/bytedeco/javacpp/Pointer$NativeDeallocator",
"java/nio/Buffer",
"java/lang/Object",
"java/lang/NullPointerException" };
???
static int JavaCPP_offsets[18][11] = {
{ -1 },
{ sizeof(void*) },
{ sizeof(signed char) },
{ sizeof(short) },
{ sizeof(int) },
{ sizeof(jlong) },
{ sizeof(float) },
{ sizeof(double) },
{ sizeof(unsigned short) }, // idx = 8 ??? Why not wchar_t for CharPointer?
{ sizeof(void*) },
{ sizeof(bool) },
{ sizeof(long) },
{ sizeof(size_t) },
{ -1 },
{ -1 },
{ -1 },
{ -1 },
{ -1 } };
tools/Generator.java
boolean classes(boolean handleExceptions, boolean defineAdapters, boolean convertStrings, boolean declareEnums,
String loadSuffix, String baseLoadSuffix, String classPath, Class<?> ... classes) {
...
out.println("static int JavaCPP_offsets[" + jclasses.size() + "][" + maxMemberSize + 1 + "] = {");
classIterator = jclasses.iterator();
while (classIterator.hasNext()) {
out.print(" { ");
Class c = classIterator.next();
Set<String> m = members.get(c);
Iterator<String> memberIterator = m == null ? null : m.iterator();
if (memberIterator == null || !memberIterator.hasNext()) {
out.print("-1");
} else while (memberIterator.hasNext()) {
String[] typeName = cppTypeName(c);
String valueTypeName = valueTypeName(typeName);
String memberName = memberIterator.next();
if ("sizeof".equals(memberName)) {
if ("void".equals(valueTypeName)) {
valueTypeName = "void*";
}
out.print("sizeof(" + valueTypeName + ")");
} else {
out.print("offsetof(" + valueTypeName + ", " + memberName + ")");
}
if (memberIterator.hasNext()) {
out.print(", ");
}
}
out.print(" }");
if (classIterator.hasNext()) {
out.println(",");
}
}
...
}
// L:3588
String[] cppTypeName(Class<?> type) {
String prefix = "", suffix = "";
if (type == Buffer.class || type == Pointer.class) {
prefix = "void*";
} else if (type == byte[].class || type == ByteBuffer.class || type == BytePointer.class) {
prefix = "signed char*";
} else if (type == short[].class || type == ShortBuffer.class || type == ShortPointer.class) {
prefix = "short*";
} else if (type == int[].class || type == IntBuffer.class || type == IntPointer.class) {
prefix = "int*";
} else if (type == long[].class || type == LongBuffer.class || type == LongPointer.class) {
prefix = "jlong*";
} else if (type == float[].class || type == FloatBuffer.class || type == FloatPointer.class) {
prefix = "float*";
} else if (type == double[].class || type == DoubleBuffer.class || type == DoublePointer.class) {
prefix = "double*";
} else if (type == char[].class || type == CharBuffer.class || type == CharPointer.class) {
prefix = "unsigned short*";
} else if (type == boolean[].class) {
prefix = "unsigned char*";
} else if (type == PointerPointer.class) {
prefix = "void**";
} else if (type == String.class) {
prefix = "const char*";
} else if (type == byte.class) {
prefix = "signed char";
} else if (type == long.class) {
prefix = "jlong";
} else if (type == char.class) {
prefix = "unsigned short";
} else if (type == boolean.class) {
prefix = "unsigned char";
} else if (type.isPrimitive()) {
prefix = type.getName();
} else if (FunctionPointer.class.isAssignableFrom(type)) {
Method[] functionMethods = functionMethods(type, null);
String[] prefixSuffix = cppFunctionTypeName(functionMethods);
if (prefixSuffix != null) {
return prefixSuffix;
}
} else {
String scopedType = cppScopeName(type);
if (scopedType.length() > 0) {
prefix = scopedType + (Enum.class.isAssignableFrom(type) ? "" : "*");
} else {
logger.warn("The class " + type.getCanonicalName() +
" does not map to any C++ type. Compilation will most likely fail.");
}
}
return new String[] { prefix, suffix };
}
static String constValueTypeName(String ... typeName) {
String type = typeName[0];
if (type.endsWith("*") || type.endsWith("&")) {
type = type.substring(0, type.length()-1);
}
return type;
}
static String valueTypeName(String ... typeName) {
String type = typeName[0];
if (type.startsWith("const ")) {
type = type.substring(6, type.length()-1);
} else if (type.endsWith("*") || type.endsWith("&")) {
type = type.substring(0, type.length()-1);
}
return type;
}
misc check
CharPointer res = l.getSuffix2();
System.out.println("addSuffix2: " + res.getString());
System.out.println("limit: " + res.limit());
System.out.println("capacity: " + res.capacity());
System.out.println("sizeof: " + res.sizeof());
System.out.println("position: " + res.position());
long resCharNum = res.limit() * res.sizeof();
System.out.println("resCharNum: " + resCharNum);
char[] c2 = new char[(int)resCharNum];
res.get(c2);
System.out.println("c2: " + new String(c2));