diff --git a/example/example-base/src/main/java/com/github/xpenatan/jparser/example/NormalClassTest.java b/example/example-base/src/main/java/com/github/xpenatan/jparser/example/NormalClassTest.java index 0badcb76..ec9f2c81 100644 --- a/example/example-base/src/main/java/com/github/xpenatan/jparser/example/NormalClassTest.java +++ b/example/example-base/src/main/java/com/github/xpenatan/jparser/example/NormalClassTest.java @@ -1,6 +1,9 @@ package com.github.xpenatan.jparser.example; public class NormalClassTest { + /*[-C++;-NATIVE] + #include "NormalClassTest.h" + */ } \ No newline at end of file diff --git a/example/example-build/build.gradle b/example/example-build/build.gradle index 1474223d..d29d0647 100644 --- a/example/example-build/build.gradle +++ b/example/example-build/build.gradle @@ -3,6 +3,7 @@ apply plugin: "java" project.ext.mainClassName = "com.github.xpenatan.jparser.example.Main" dependencies { + implementation project(":example:example-base") implementation project(":IDLReader") implementation project(":jParser:core") implementation project(":jParser:teavm") diff --git a/example/example-build/jni/cpp/src/ParentClassTest.cpp b/example/example-build/jni/cpp/src/ParentClassTest.cpp new file mode 100644 index 00000000..b4336488 --- /dev/null +++ b/example/example-build/jni/cpp/src/ParentClassTest.cpp @@ -0,0 +1,6 @@ +#include "ParentClassTest.h" + +float ParentClassTest::getFloatValue() +{ + return 1.1; +} \ No newline at end of file diff --git a/example/example-build/jni/cpp/src/ParentClassTest.h b/example/example-build/jni/cpp/src/ParentClassTest.h new file mode 100644 index 00000000..d85f8283 --- /dev/null +++ b/example/example-build/jni/cpp/src/ParentClassTest.h @@ -0,0 +1,10 @@ +#ifndef PARENTCLASSTEST_H +#define PARENTCLASSTEST_H + +class ParentClassTest +{ +public: + float getFloatValue(); +} + +#endif //PARENTCLASSTEST_H diff --git a/example/example-build/src/main/java/com/github/xpenatan/jparser/example/Main.java b/example/example-build/src/main/java/com/github/xpenatan/jparser/example/Main.java index 675170a8..6cf887e4 100644 --- a/example/example-build/src/main/java/com/github/xpenatan/jparser/example/Main.java +++ b/example/example-build/src/main/java/com/github/xpenatan/jparser/example/Main.java @@ -2,8 +2,12 @@ import com.github.xpenatan.jparser.core.JParser; import com.github.xpenatan.jparser.core.codeparser.IDLDefaultCodeParser; +import com.github.xpenatan.jparser.cpp.CPPBuildHelper; import com.github.xpenatan.jparser.cpp.CppCodeParser; +import com.github.xpenatan.jparser.cpp.CppGenerator; import com.github.xpenatan.jparser.cpp.FileCopyHelper; +import com.github.xpenatan.jparser.cpp.NativeCPPGenerator; +import com.github.xpenatan.jparser.cpp.NativeCPPGeneratorV2; import com.github.xpenatan.jparser.idl.IDLReader; import java.io.File; @@ -26,19 +30,23 @@ private static void generateClassOnly() throws Exception { } private static void generateCPP() throws Exception { + String libName = "example-test"; String basePackage = "com.github.xpenatan.jparser.example"; String idlPath = "src\\main\\resources\\idl\\Test.idl"; String baseJavaDir = new File(".").getAbsolutePath() + "./example-base/src/main/java"; String genDir = "../example-core/src/main/java"; - String classPath = CppCodeParser.getClassPath("bullet-base", "gdx-1", "gdx-jnigen-loader", "jParser-loader"); + String classPath = CppCodeParser.getClassPath("example-base", "gdx-1", "gdx-jnigen-loader", "jParser-loader"); String cppPath = new File("./jni/").getCanonicalPath(); String jniBuildPath = cppPath + "/build/c++/"; FileCopyHelper.copyDir(cppPath + "/cpp/src/", jniBuildPath + "/src"); IDLReader idlReader = IDLReader.readIDL(idlPath); - CppCodeParser idlParser = new CppCodeParser(basePackage, idlReader, classPath, jniBuildPath); + + CppGenerator cppGenerator = new NativeCPPGeneratorV2(jniBuildPath); + CppCodeParser idlParser = new CppCodeParser(cppGenerator, idlReader, basePackage); idlParser.generateClass = true; JParser.generate(idlParser, baseJavaDir, genDir); +// CPPBuildHelper.build(libName, jniBuildPath); } } diff --git a/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/CppCodeParser.java b/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/CppCodeParser.java index 64ef040f..999d29e0 100644 --- a/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/CppCodeParser.java +++ b/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/CppCodeParser.java @@ -90,21 +90,31 @@ public static String getClassPath(String ... includes) { return newClassPath; } - CppGenerator cppGenerator; + private CppGenerator cppGenerator; + @Deprecated public CppCodeParser(String classpath, String jniDir) { this(null, classpath, jniDir); } + @Deprecated public CppCodeParser(IDLReader idlReader, String classpath, String jniDir) { super(HEADER_CMD, idlReader); cppGenerator = new NativeCPPGenerator(classpath, jniDir); enableAttributeParsing = false; } - public CppCodeParser(String basePackage, IDLReader idlReader, String classpath, String jniDir) { + public CppCodeParser(CppGenerator cppGenerator) { + this(cppGenerator, null); + } + + public CppCodeParser(CppGenerator cppGenerator, IDLReader idlReader) { + this(cppGenerator, idlReader, ""); + } + + public CppCodeParser(CppGenerator cppGenerator, IDLReader idlReader, String basePackage) { super(basePackage, HEADER_CMD, idlReader); - cppGenerator = new NativeCPPGenerator(classpath, jniDir); + this.cppGenerator = cppGenerator; enableAttributeParsing = false; } @@ -324,7 +334,7 @@ else if(returnTypeName.equals("btQuaternion") || returnTypeName.equals("Quaterni public boolean parseCodeBlock(Node node, String headerCommands, String content) { if(!super.parseCodeBlock(node, headerCommands, content)) { if(headerCommands.contains(CMD_NATIVE)) { - cppGenerator.addNativeCode(content, node); + cppGenerator.addNativeCode(node, content); return true; } } @@ -333,7 +343,7 @@ public boolean parseCodeBlock(Node node, String headerCommands, String content) @Override protected void setJavaBodyNativeCMD(String content, MethodDeclaration methodDeclaration) { - cppGenerator.addNativeMethod(content, methodDeclaration); + cppGenerator.addNativeCode(methodDeclaration, content); } @Override @@ -394,26 +404,11 @@ else if(parameters.size() == 0) { @Override public void onParseFileEnd(JParser jParser, JParserItem parserItem) { - cppGenerator.addParseFile(jParser.sourceDir, parserItem.inputPath, parserItem.destinationPath); + cppGenerator.addParseFile(jParser, parserItem); } @Override public void onParseEnd(JParser jParser) { - FileDescriptor cppBuild = FileDescriptor.tempDirectory("cppBuild"); - String tempPath = cppBuild.file().getAbsolutePath(); - String classes = ""; - for(JParserItem item : jParser.unitArray) { - classes += item.destinationPath + " "; - } - File file = new File(jParser.genDir); - String command = "javac -cp " + cppGenerator.getClasspath() + " -d " + tempPath + " " + classes; - - System.out.println("command: " + command); - CPPBuildHelper.startProcess(file, command); - - String classpath = cppGenerator.getClasspath(); - classpath += tempPath + ";"; - cppGenerator.setClasspath(classpath); - cppGenerator.generate(); + cppGenerator.generate(jParser); } } \ No newline at end of file diff --git a/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/CppGenerator.java b/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/CppGenerator.java index 45930500..900ff701 100644 --- a/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/CppGenerator.java +++ b/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/CppGenerator.java @@ -2,18 +2,15 @@ import com.github.javaparser.ast.Node; import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.xpenatan.jparser.core.JParser; +import com.github.xpenatan.jparser.core.JParserItem; public interface CppGenerator { + void addNativeCode(Node node, String content); - public void addNativeMethod(String content, MethodDeclaration methodDeclaration); + void addNativeCode(MethodDeclaration methodDeclaration, String content); - public void addNativeCode(String content, Node node); + void addParseFile(JParser jParser, JParserItem parserItem); - void addParseFile(String sourceBaseDir, String inputJavaPath, String destinationJavaPath); - - void generate(); - - String getClasspath(); - - void setClasspath(String classpath); -} + void generate(JParser jParser); +} \ No newline at end of file diff --git a/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/CppParserItem.java b/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/CppParserItem.java deleted file mode 100644 index 6121d085..00000000 --- a/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/CppParserItem.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.github.xpenatan.jparser.cpp; - -import com.badlogic.gdx.jnigen.parsing.JavaMethodParser; -import java.util.ArrayList; - -public class CppParserItem { - public String sourceBaseDir; - public String inputJavaPath; - public String destinationJavaPath; - public final ArrayList javaSegments = new ArrayList<>(); -} \ No newline at end of file diff --git a/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/NativeCPPGenerator.java b/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/NativeCPPGenerator.java index ce774c55..a51cba00 100644 --- a/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/NativeCPPGenerator.java +++ b/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/NativeCPPGenerator.java @@ -9,6 +9,8 @@ import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.body.Parameter; +import com.github.xpenatan.jparser.core.JParser; +import com.github.xpenatan.jparser.core.JParserItem; import com.github.xpenatan.jparser.core.util.CustomFileDescriptor; import java.io.File; import java.io.IOException; @@ -25,6 +27,7 @@ /** * Modified version of gdx-jnigen NativeCodeGenerator */ +@Deprecated public class NativeCPPGenerator implements CppGenerator { private CustomFileDescriptor jniDir; @@ -97,7 +100,11 @@ public NativeCPPGenerator(String classpath, String jniDir) { } @Override - public void addParseFile(String sourceBaseDir, String inputJavaPath, String destinationJavaPath) { + public void addParseFile(JParser jParser, JParserItem jParserItem) { + String sourceBaseDir = jParser.sourceDir; + String inputJavaPath = jParserItem.inputPath; + String destinationJavaPath = jParserItem.destinationPath; + if(javaSegments.size() == 0) { return; } @@ -126,7 +133,23 @@ else if(o1.getStartIndex() > o2.getStartIndex()) { } @Override - public void generate() { + public void generate(JParser jParser) { + FileDescriptor cppBuild = FileDescriptor.tempDirectory("cppBuild"); + String tempPath = cppBuild.file().getAbsolutePath(); + String classes = ""; + for(JParserItem item : jParser.unitArray) { + classes += item.destinationPath + " "; + } + File file = new File(jParser.genDir); + String command = "javac -cp " + this.classpath + " -d " + tempPath + " " + classes; + + System.out.println("command: " + command); + CPPBuildHelper.startProcess(file, command); + + String classpath = this.classpath; + classpath += tempPath + ";"; + this.classpath = classpath; + for(int i = 0; i < parserItems.size(); i++) { CppParserItem parserItem = parserItems.get(i); if(parserItem.javaSegments.size() != 0) { @@ -152,6 +175,7 @@ private void parseItem(CppParserItem parserItem) { } FileDescriptor cppFile = new FileDescriptor(jniDir + "/" + className + ".cpp"); + System.out.println("Generating C++: " + cppFile.path()); generateCppFile(javaSegments, hFiles, cppFile); } catch(Exception e) { @@ -160,7 +184,7 @@ private void parseItem(CppParserItem parserItem) { } @Override - public void addNativeMethod(String content, MethodDeclaration methodDeclaration) { + public void addNativeCode(MethodDeclaration methodDeclaration, String content) { JavaMethodParser.JavaMethod method = createMethod(content, methodDeclaration); if(method != null) { javaSegments.add(method); @@ -168,22 +192,12 @@ public void addNativeMethod(String content, MethodDeclaration methodDeclaration) } @Override - public void addNativeCode(String content, Node node) { + public void addNativeCode(Node node, String content) { int startLine = startCode; int endLine = 0; startCode++; javaSegments.add(new JavaMethodParser.JniSection(content + "\n\n", startLine, endLine)); -// node.remove(); - } - - @Override - public String getClasspath() { - return classpath; - } - - @Override - public void setClasspath(String classpath) { - this.classpath = classpath; + // node.remove(); } private JavaMethodParser.JavaMethod createMethod(String content, MethodDeclaration method) { @@ -573,4 +587,11 @@ private void emitLineMarker(StringBuffer buffer, int line) { buffer.append(line); buffer.append("\n"); } + + private static class CppParserItem { + public String sourceBaseDir; + public String inputJavaPath; + public String destinationJavaPath; + public final ArrayList javaSegments = new ArrayList<>(); + } } diff --git a/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/NativeCPPGeneratorV2.java b/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/NativeCPPGeneratorV2.java new file mode 100644 index 00000000..7a67ef1c --- /dev/null +++ b/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/NativeCPPGeneratorV2.java @@ -0,0 +1,33 @@ +package com.github.xpenatan.jparser.cpp; + +import com.github.javaparser.ast.Node; +import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.xpenatan.jparser.core.JParser; +import com.github.xpenatan.jparser.core.JParserItem; + +public class NativeCPPGeneratorV2 implements CppGenerator { + + private String jniDir; + + public NativeCPPGeneratorV2(String jniDir) { + this.jniDir = jniDir; + } + + @Override + public void addNativeCode(Node node, String content) { + } + + @Override + public void addNativeCode(MethodDeclaration methodDeclaration, String content) { + } + + @Override + public void addParseFile(JParser jParser, JParserItem parserItem) { + System.out.println(); + } + + @Override + public void generate(JParser jParser) { + + } +}