/******************************************************************************* * Copyright 2011 See AUTHORS file. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package com.badlogic.gdx.jnigen; import java.util.ArrayList; import com.badlogic.gdx.jnigen.BuildTarget.TargetOs; import com.badlogic.gdx.jnigen.FileDescriptor.FileType; public class AndroidNdkScriptGenerator { public void generate (BuildConfig config, BuildTarget target) { if (target.os != TargetOs.Android) throw new IllegalArgumentException("target os must be Android"); // create all the directories for outputing object files, shared libs and natives jar as well as build scripts. if (!config.libsDir.exists()) { if (!config.libsDir.mkdirs()) throw new RuntimeException("Couldn't create directory for shared library files in '" + config.libsDir + "'"); } if (!config.jniDir.exists()) { if (!config.jniDir.mkdirs()) throw new RuntimeException("Couldn't create native code directory '" + config.jniDir + "'"); } ArrayList<FileDescriptor> files = new ArrayList<FileDescriptor>(); int idx = 0; String[] includes = new String[target.cIncludes.length + target.cppIncludes.length]; for (String include : target.cIncludes) includes[idx++] = config.jniDir + "/" + include; for (String include : target.cppIncludes) includes[idx++] = config.jniDir + "/" + include; idx = 0; String[] excludes = new String[target.cExcludes.length + target.cppExcludes.length + 1]; for (String exclude : target.cExcludes) excludes[idx++] = config.jniDir + "/" + exclude; for (String exclude : target.cppExcludes) excludes[idx++] = config.jniDir + "/" + exclude; excludes[idx] = "**/target/*"; gatherSourceFiles(config.jniDir, includes, excludes, files); // create Application.mk file FileDescriptor application = config.jniDir.child("Application.mk"); application.writeString(new FileDescriptor("com/badlogic/gdx/jnigen/resources/scripts/Application.mk.template", FileType.Classpath).readString(), false); // create Android.mk file String template = new FileDescriptor("com/badlogic/gdx/jnigen/resources/scripts/Android.mk.template", FileType.Classpath) .readString(); StringBuffer srcFiles = new StringBuffer(); for (int i = 0; i < files.size(); i++) { if (i > 0) srcFiles.append("\t"); srcFiles.append(files.get(i).path().replace('\\', '/').replace(config.jniDir.toString() + "/", "")); if (i < files.size() - 1) srcFiles.append("\\\n"); else srcFiles.append("\n"); } StringBuffer headerDirs = new StringBuffer(); for (String headerDir : target.headerDirs) { headerDirs.append(headerDir); headerDirs.append(" "); } template = template.replace("%sharedLibName%", config.sharedLibName); template = template.replace("%headerDirs%", headerDirs); template = template.replace("%cFlags%", target.cFlags); template = template.replace("%cppFlags%", target.cppFlags); template = template.replace("%linkerFlags%", target.linkerFlags); template = template.replace("%srcFiles%", srcFiles); config.jniDir.child("Android.mk").writeString(template, false); } private void gatherSourceFiles (FileDescriptor file, String[] includes, String[] excludes, ArrayList<FileDescriptor> files) { String fileName = file.path().replace('\\', '/'); if (file.isDirectory()) { if (match(fileName, excludes)) return; for (FileDescriptor child : file.list()) { gatherSourceFiles(child, includes, excludes, files); } } else { if (match(fileName, includes) && !match(fileName, excludes)) files.add(file); } } private boolean match (String file, String[] patterns) { return new AntPathMatcher().match(file, patterns); } }