Skip to content

Commit

Permalink
wip prepare generator v2
Browse files Browse the repository at this point in the history
  • Loading branch information
xpenatan committed Jul 5, 2023
1 parent 0b4f842 commit 0d55d27
Show file tree
Hide file tree
Showing 10 changed files with 123 additions and 60 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.github.xpenatan.jparser.example;

public class NormalClassTest {
/*[-C++;-NATIVE]
#include "NormalClassTest.h"
*/


}
1 change: 1 addition & 0 deletions example/example-build/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
6 changes: 6 additions & 0 deletions example/example-build/jni/cpp/src/ParentClassTest.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#include "ParentClassTest.h"

float ParentClassTest::getFloatValue()
{
return 1.1;
}
10 changes: 10 additions & 0 deletions example/example-build/jni/cpp/src/ParentClassTest.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#ifndef PARENTCLASSTEST_H
#define PARENTCLASSTEST_H

class ParentClassTest
{
public:
float getFloatValue();
}

#endif //PARENTCLASSTEST_H
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
}
}
Expand All @@ -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
Expand Down Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -25,6 +27,7 @@
/**
* Modified version of gdx-jnigen NativeCodeGenerator
*/
@Deprecated
public class NativeCPPGenerator implements CppGenerator {

private CustomFileDescriptor jniDir;
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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) {
Expand All @@ -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) {
Expand All @@ -160,30 +184,20 @@ 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);
}
}

@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) {
Expand Down Expand Up @@ -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<JavaMethodParser.JavaSegment> javaSegments = new ArrayList<>();
}
}
Original file line number Diff line number Diff line change
@@ -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) {

}
}

0 comments on commit 0d55d27

Please sign in to comment.