1*d57664e9SAndroid Build Coastguard Worker#!/usr/bin/env python 2*d57664e9SAndroid Build Coastguard Worker 3*d57664e9SAndroid Build Coastguard Worker# 4*d57664e9SAndroid Build Coastguard Worker# Copyright (C) 2011 The Android Open Source Project 5*d57664e9SAndroid Build Coastguard Worker# 6*d57664e9SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 7*d57664e9SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 8*d57664e9SAndroid Build Coastguard Worker# You may obtain a copy of the License at 9*d57664e9SAndroid Build Coastguard Worker# 10*d57664e9SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 11*d57664e9SAndroid Build Coastguard Worker# 12*d57664e9SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 13*d57664e9SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 14*d57664e9SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15*d57664e9SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 16*d57664e9SAndroid Build Coastguard Worker# limitations under the License. 17*d57664e9SAndroid Build Coastguard Worker# 18*d57664e9SAndroid Build Coastguard Worker 19*d57664e9SAndroid Build Coastguard Workerimport os 20*d57664e9SAndroid Build Coastguard Workerimport sys 21*d57664e9SAndroid Build Coastguard Worker 22*d57664e9SAndroid Build Coastguard WorkerhFileTemplate = """/** 23*d57664e9SAndroid Build Coastguard Worker * This file is auto-generated by platform/system/media/mca/structgen.py! Do NOT modify! 24*d57664e9SAndroid Build Coastguard Worker **/ 25*d57664e9SAndroid Build Coastguard Worker 26*d57664e9SAndroid Build Coastguard Worker#ifndef %s 27*d57664e9SAndroid Build Coastguard Worker#define %s 28*d57664e9SAndroid Build Coastguard Worker 29*d57664e9SAndroid Build Coastguard Worker%s 30*d57664e9SAndroid Build Coastguard Worker 31*d57664e9SAndroid Build Coastguard Worker#endif // %s 32*d57664e9SAndroid Build Coastguard Worker""" 33*d57664e9SAndroid Build Coastguard Worker 34*d57664e9SAndroid Build Coastguard WorkerjniFileTemplate = """/** 35*d57664e9SAndroid Build Coastguard Worker * This file is auto-generated by platform/system/media/mca/structgen.py! Do NOT modify! 36*d57664e9SAndroid Build Coastguard Worker **/ 37*d57664e9SAndroid Build Coastguard Worker 38*d57664e9SAndroid Build Coastguard Worker#include <stdint.h> 39*d57664e9SAndroid Build Coastguard Worker#include "native/%s.h" 40*d57664e9SAndroid Build Coastguard Worker 41*d57664e9SAndroid Build Coastguard Worker#ifdef __cplusplus 42*d57664e9SAndroid Build Coastguard Workerextern "C" { 43*d57664e9SAndroid Build Coastguard Worker#endif 44*d57664e9SAndroid Build Coastguard Worker 45*d57664e9SAndroid Build Coastguard Worker#include "jni.h" 46*d57664e9SAndroid Build Coastguard Worker 47*d57664e9SAndroid Build Coastguard Worker// Helper functions //////////////////////////////////////////////////////////////////////////////// 48*d57664e9SAndroid Build Coastguard Worker%s* Get%sAtIndex(JNIEnv* env, jobject buffer, int index) { 49*d57664e9SAndroid Build Coastguard Worker jclass base_class = (*env)->FindClass(env, "android/filterfw/core/NativeBuffer"); 50*d57664e9SAndroid Build Coastguard Worker jfieldID ptr_field = (*env)->GetFieldID(env, base_class, "mDataPointer", "J"); 51*d57664e9SAndroid Build Coastguard Worker uintptr_t data_ptr = (*env)->GetLongField(env, buffer, ptr_field); 52*d57664e9SAndroid Build Coastguard Worker %s* array = (%s*)data_ptr; 53*d57664e9SAndroid Build Coastguard Worker (*env)->DeleteLocalRef(env, base_class); 54*d57664e9SAndroid Build Coastguard Worker return &array[index]; 55*d57664e9SAndroid Build Coastguard Worker} 56*d57664e9SAndroid Build Coastguard Worker 57*d57664e9SAndroid Build Coastguard Worker// Declarations //////////////////////////////////////////////////////////////////////////////////// 58*d57664e9SAndroid Build Coastguard WorkerJNIEXPORT jint JNICALL 59*d57664e9SAndroid Build Coastguard WorkerJava_%s_getElementSize(JNIEnv* env, jobject thiz); 60*d57664e9SAndroid Build Coastguard Worker 61*d57664e9SAndroid Build Coastguard Worker%s 62*d57664e9SAndroid Build Coastguard Worker 63*d57664e9SAndroid Build Coastguard Worker#ifdef __cplusplus 64*d57664e9SAndroid Build Coastguard Worker} 65*d57664e9SAndroid Build Coastguard Worker#endif 66*d57664e9SAndroid Build Coastguard Worker 67*d57664e9SAndroid Build Coastguard Worker// Implementation ////////////////////////////////////////////////////////////////////////////////// 68*d57664e9SAndroid Build Coastguard Workerjint Java_%s_getElementSize(JNIEnv* env, jobject thiz) { 69*d57664e9SAndroid Build Coastguard Worker return sizeof(%s); 70*d57664e9SAndroid Build Coastguard Worker} 71*d57664e9SAndroid Build Coastguard Worker 72*d57664e9SAndroid Build Coastguard Worker%s 73*d57664e9SAndroid Build Coastguard Worker""" 74*d57664e9SAndroid Build Coastguard Worker 75*d57664e9SAndroid Build Coastguard WorkerjavaFileTemplate = """/** 76*d57664e9SAndroid Build Coastguard Worker * This file is auto-generated by platform/system/media/mca/structgen.py! Do NOT modify! 77*d57664e9SAndroid Build Coastguard Worker **/ 78*d57664e9SAndroid Build Coastguard Worker 79*d57664e9SAndroid Build Coastguard Workerpackage %s; 80*d57664e9SAndroid Build Coastguard Worker 81*d57664e9SAndroid Build Coastguard Workerimport android.filterfw.core.NativeBuffer; 82*d57664e9SAndroid Build Coastguard Worker 83*d57664e9SAndroid Build Coastguard Worker%s 84*d57664e9SAndroid Build Coastguard Worker""" 85*d57664e9SAndroid Build Coastguard Worker 86*d57664e9SAndroid Build Coastguard Worker 87*d57664e9SAndroid Build Coastguard Workerdef ToJavaName(cname, start_upper_at = 1): 88*d57664e9SAndroid Build Coastguard Worker lower = cname.split("_") 89*d57664e9SAndroid Build Coastguard Worker upper = [c.title() for c in lower] 90*d57664e9SAndroid Build Coastguard Worker return "".join(lower[:start_upper_at] + upper[start_upper_at:]) 91*d57664e9SAndroid Build Coastguard Worker 92*d57664e9SAndroid Build Coastguard Workerdef ToJNIPackage(package, jclassname): 93*d57664e9SAndroid Build Coastguard Worker return "%s_%s" % (package.replace(".", "_"), jclassname) 94*d57664e9SAndroid Build Coastguard Worker 95*d57664e9SAndroid Build Coastguard Workerdef ToMacroDefName(cname, pname): 96*d57664e9SAndroid Build Coastguard Worker return "%s_%s" % (pname.replace(".", "_").upper(), cname.upper()) 97*d57664e9SAndroid Build Coastguard Worker 98*d57664e9SAndroid Build Coastguard Workerclass ParseError: 99*d57664e9SAndroid Build Coastguard Worker def __init__(self, lineno, message): 100*d57664e9SAndroid Build Coastguard Worker self.lineno = lineno 101*d57664e9SAndroid Build Coastguard Worker self.message = message 102*d57664e9SAndroid Build Coastguard Worker 103*d57664e9SAndroid Build Coastguard Worker def __str__(self): 104*d57664e9SAndroid Build Coastguard Worker return "On line %d: %s" % (self.lineno, self.message) 105*d57664e9SAndroid Build Coastguard Worker 106*d57664e9SAndroid Build Coastguard Workerclass FieldType_BasePOD: 107*d57664e9SAndroid Build Coastguard Worker def __init__(self, name, structname, jclassname, package, javatype, ctype, jtype, defval): 108*d57664e9SAndroid Build Coastguard Worker self.name = name 109*d57664e9SAndroid Build Coastguard Worker self.structname = structname 110*d57664e9SAndroid Build Coastguard Worker self.jclassname = jclassname 111*d57664e9SAndroid Build Coastguard Worker self.package = package 112*d57664e9SAndroid Build Coastguard Worker self.javatype = javatype 113*d57664e9SAndroid Build Coastguard Worker self.ctype = ctype 114*d57664e9SAndroid Build Coastguard Worker self.jtype = jtype 115*d57664e9SAndroid Build Coastguard Worker self.defval = defval 116*d57664e9SAndroid Build Coastguard Worker 117*d57664e9SAndroid Build Coastguard Worker def cString(self): 118*d57664e9SAndroid Build Coastguard Worker return " %s %s;" % (self.ctype, self.name) 119*d57664e9SAndroid Build Coastguard Worker 120*d57664e9SAndroid Build Coastguard Worker def javaGetter(self): 121*d57664e9SAndroid Build Coastguard Worker return " public %s get%s(int index) {\n"\ 122*d57664e9SAndroid Build Coastguard Worker " assertReadable();\n"\ 123*d57664e9SAndroid Build Coastguard Worker " return nativeGet%s(index);\n"\ 124*d57664e9SAndroid Build Coastguard Worker " }" % (self.javatype, ToJavaName(self.name, 0), ToJavaName(self.name, 0)) 125*d57664e9SAndroid Build Coastguard Worker 126*d57664e9SAndroid Build Coastguard Worker def javaSetter(self): 127*d57664e9SAndroid Build Coastguard Worker return " public void set%s(int index, %s value) {\n"\ 128*d57664e9SAndroid Build Coastguard Worker " assertWritable();\n"\ 129*d57664e9SAndroid Build Coastguard Worker " nativeSet%s(index, value);\n"\ 130*d57664e9SAndroid Build Coastguard Worker " }" % (ToJavaName(self.name, 0), self.javatype, ToJavaName(self.name, 0)) 131*d57664e9SAndroid Build Coastguard Worker 132*d57664e9SAndroid Build Coastguard Worker def javaNativeGetter(self): 133*d57664e9SAndroid Build Coastguard Worker return " private native %s nativeGet%s(int index);"\ 134*d57664e9SAndroid Build Coastguard Worker % (self.javatype, ToJavaName(self.name, 0)) 135*d57664e9SAndroid Build Coastguard Worker 136*d57664e9SAndroid Build Coastguard Worker def javaNativeSetter(self): 137*d57664e9SAndroid Build Coastguard Worker return " private native boolean nativeSet%s(int index, %s value);"\ 138*d57664e9SAndroid Build Coastguard Worker % (ToJavaName(self.name, 0), self.javatype) 139*d57664e9SAndroid Build Coastguard Worker 140*d57664e9SAndroid Build Coastguard Worker def jniGetterDefString(self): 141*d57664e9SAndroid Build Coastguard Worker return "JNIEXPORT %s JNICALL\n" \ 142*d57664e9SAndroid Build Coastguard Worker "Java_%s_nativeGet%s(JNIEnv* env, jobject thiz, jint index);" \ 143*d57664e9SAndroid Build Coastguard Worker % (self.jtype, ToJNIPackage(self.package, self.jclassname), ToJavaName(self.name, 0)) 144*d57664e9SAndroid Build Coastguard Worker 145*d57664e9SAndroid Build Coastguard Worker def jniGetterImplString(self): 146*d57664e9SAndroid Build Coastguard Worker return \ 147*d57664e9SAndroid Build Coastguard Worker "%s Java_%s_nativeGet%s(JNIEnv* env, jobject thiz, jint index) {\n"\ 148*d57664e9SAndroid Build Coastguard Worker " %s* instance = Get%sAtIndex(env, thiz, index);\n"\ 149*d57664e9SAndroid Build Coastguard Worker " return instance ? instance->%s : %s;\n"\ 150*d57664e9SAndroid Build Coastguard Worker "}\n" % (self.jtype, ToJNIPackage(self.package, self.jclassname), ToJavaName(self.name, 0),\ 151*d57664e9SAndroid Build Coastguard Worker self.structname, self.structname, self.name, self.defval) 152*d57664e9SAndroid Build Coastguard Worker 153*d57664e9SAndroid Build Coastguard Worker def jniSetterDefString(self): 154*d57664e9SAndroid Build Coastguard Worker return "JNIEXPORT jboolean JNICALL\n" \ 155*d57664e9SAndroid Build Coastguard Worker "Java_%s_nativeSet%s(JNIEnv* env, jobject thiz, jint index, %s value);" \ 156*d57664e9SAndroid Build Coastguard Worker % (ToJNIPackage(self.package, self.jclassname), ToJavaName(self.name, 0), self.jtype) 157*d57664e9SAndroid Build Coastguard Worker 158*d57664e9SAndroid Build Coastguard Worker def jniSetterImplString(self): 159*d57664e9SAndroid Build Coastguard Worker return \ 160*d57664e9SAndroid Build Coastguard Worker "jboolean Java_%s_nativeSet%s(JNIEnv* env, jobject thiz, jint index, %s value) {\n"\ 161*d57664e9SAndroid Build Coastguard Worker " %s* instance = Get%sAtIndex(env, thiz, index);\n"\ 162*d57664e9SAndroid Build Coastguard Worker " if (instance) {\n"\ 163*d57664e9SAndroid Build Coastguard Worker " instance->%s = value;\n"\ 164*d57664e9SAndroid Build Coastguard Worker " return JNI_TRUE;\n"\ 165*d57664e9SAndroid Build Coastguard Worker " }\n"\ 166*d57664e9SAndroid Build Coastguard Worker " return JNI_FALSE;\n"\ 167*d57664e9SAndroid Build Coastguard Worker "}\n" % (ToJNIPackage(self.package, self.jclassname), ToJavaName(self.name, 0),\ 168*d57664e9SAndroid Build Coastguard Worker self.jtype, self.structname, self.structname, self.name) 169*d57664e9SAndroid Build Coastguard Worker 170*d57664e9SAndroid Build Coastguard Workerclass FieldType_Float(FieldType_BasePOD): 171*d57664e9SAndroid Build Coastguard Worker def __init__(self, name, structname, jclassname, package): 172*d57664e9SAndroid Build Coastguard Worker FieldType_BasePOD.__init__(self, name, structname, jclassname, package, "float", "float", "jfloat", "0.0") 173*d57664e9SAndroid Build Coastguard Worker 174*d57664e9SAndroid Build Coastguard Workerclass FieldType_Int(FieldType_BasePOD): 175*d57664e9SAndroid Build Coastguard Worker def __init__(self, name, structname, jclassname, package): 176*d57664e9SAndroid Build Coastguard Worker FieldType_BasePOD.__init__(self, name, structname, jclassname, package, "int", "int", "jint", "0") 177*d57664e9SAndroid Build Coastguard Worker 178*d57664e9SAndroid Build Coastguard Workerclass FieldType_Long(FieldType_BasePOD): 179*d57664e9SAndroid Build Coastguard Worker def __init__(self, name, structname, jclassname, package): 180*d57664e9SAndroid Build Coastguard Worker FieldType_BasePOD.__init__(self, name, structname, jclassname, package, "long", "long long", "jlong", "0") 181*d57664e9SAndroid Build Coastguard Worker 182*d57664e9SAndroid Build Coastguard Workerclass StructSpec: 183*d57664e9SAndroid Build Coastguard Worker 184*d57664e9SAndroid Build Coastguard Worker def parseTextFile(self, filepath): 185*d57664e9SAndroid Build Coastguard Worker # Init 186*d57664e9SAndroid Build Coastguard Worker self.name = None 187*d57664e9SAndroid Build Coastguard Worker self.package = None 188*d57664e9SAndroid Build Coastguard Worker self.fields = [] 189*d57664e9SAndroid Build Coastguard Worker self.structname = None 190*d57664e9SAndroid Build Coastguard Worker self.jclassname = None 191*d57664e9SAndroid Build Coastguard Worker self.libname = None 192*d57664e9SAndroid Build Coastguard Worker 193*d57664e9SAndroid Build Coastguard Worker # Open the file 194*d57664e9SAndroid Build Coastguard Worker txtfile = open(filepath) 195*d57664e9SAndroid Build Coastguard Worker 196*d57664e9SAndroid Build Coastguard Worker # Parse it line by line 197*d57664e9SAndroid Build Coastguard Worker lineno = 0 198*d57664e9SAndroid Build Coastguard Worker for line in txtfile: 199*d57664e9SAndroid Build Coastguard Worker # Split line into components 200*d57664e9SAndroid Build Coastguard Worker linecomps = line.split() 201*d57664e9SAndroid Build Coastguard Worker if len(linecomps) == 0: 202*d57664e9SAndroid Build Coastguard Worker continue 203*d57664e9SAndroid Build Coastguard Worker 204*d57664e9SAndroid Build Coastguard Worker # Execute command 205*d57664e9SAndroid Build Coastguard Worker cmd = linecomps[0] 206*d57664e9SAndroid Build Coastguard Worker if cmd == "@name": 207*d57664e9SAndroid Build Coastguard Worker self.commandArgAssert(linecomps, 1, lineno) 208*d57664e9SAndroid Build Coastguard Worker self.name = linecomps[1] 209*d57664e9SAndroid Build Coastguard Worker if not self.structname: 210*d57664e9SAndroid Build Coastguard Worker self.structname = self.name 211*d57664e9SAndroid Build Coastguard Worker if not self.jclassname: 212*d57664e9SAndroid Build Coastguard Worker self.jclassname = self.name 213*d57664e9SAndroid Build Coastguard Worker elif cmd == "@package": 214*d57664e9SAndroid Build Coastguard Worker self.commandArgAssert(linecomps, 1, lineno) 215*d57664e9SAndroid Build Coastguard Worker self.package = linecomps[1] 216*d57664e9SAndroid Build Coastguard Worker elif cmd == "@libname": 217*d57664e9SAndroid Build Coastguard Worker self.commandArgAssert(linecomps, 1, lineno) 218*d57664e9SAndroid Build Coastguard Worker self.libname = linecomps[1] 219*d57664e9SAndroid Build Coastguard Worker elif cmd == "@structname": 220*d57664e9SAndroid Build Coastguard Worker self.commandArgAssert(linecomps, 1, lineno) 221*d57664e9SAndroid Build Coastguard Worker self.structname = linecomps[1] 222*d57664e9SAndroid Build Coastguard Worker elif cmd == "@javaclassname": 223*d57664e9SAndroid Build Coastguard Worker self.commandArgAssert(linecomps, 1, lineno) 224*d57664e9SAndroid Build Coastguard Worker self.jclassname = linecomps[1] 225*d57664e9SAndroid Build Coastguard Worker elif cmd == "@field": 226*d57664e9SAndroid Build Coastguard Worker self.commandArgAssert(linecomps, 2, lineno) 227*d57664e9SAndroid Build Coastguard Worker typestr = linecomps[1] 228*d57664e9SAndroid Build Coastguard Worker if typestr == "int": 229*d57664e9SAndroid Build Coastguard Worker fieldtype = FieldType_Int(linecomps[2], self.structname, self.jclassname, self.package) 230*d57664e9SAndroid Build Coastguard Worker elif typestr == "long": 231*d57664e9SAndroid Build Coastguard Worker fieldtype = FieldType_Long(linecomps[2], self.structname, self.jclassname, self.package) 232*d57664e9SAndroid Build Coastguard Worker elif typestr == "float": 233*d57664e9SAndroid Build Coastguard Worker fieldtype = FieldType_Float(linecomps[2], self.structname, self.jclassname, self.package) 234*d57664e9SAndroid Build Coastguard Worker else: 235*d57664e9SAndroid Build Coastguard Worker raise ParseError(lineno, "Unknown field type '%s'!" % typestr) 236*d57664e9SAndroid Build Coastguard Worker self.fields.append(fieldtype) 237*d57664e9SAndroid Build Coastguard Worker else: 238*d57664e9SAndroid Build Coastguard Worker raise ParseError(lineno, "Unknown command: '%s'!" % cmd) 239*d57664e9SAndroid Build Coastguard Worker 240*d57664e9SAndroid Build Coastguard Worker lineno = lineno + 1 241*d57664e9SAndroid Build Coastguard Worker 242*d57664e9SAndroid Build Coastguard Worker # Make sure we have all required info 243*d57664e9SAndroid Build Coastguard Worker if not self.name: 244*d57664e9SAndroid Build Coastguard Worker raise ParseError(lineno, "Required field '@name' missing!") 245*d57664e9SAndroid Build Coastguard Worker elif not self.package: 246*d57664e9SAndroid Build Coastguard Worker raise ParseError(lineno, "Required field '@package' missing!") 247*d57664e9SAndroid Build Coastguard Worker elif not self.libname: 248*d57664e9SAndroid Build Coastguard Worker raise ParseError(lineno, "Required field '@libname' missing!") 249*d57664e9SAndroid Build Coastguard Worker 250*d57664e9SAndroid Build Coastguard Worker # Normalize values 251*d57664e9SAndroid Build Coastguard Worker if self.libname[:3] == "lib": 252*d57664e9SAndroid Build Coastguard Worker self.libname = self.libname[3:] 253*d57664e9SAndroid Build Coastguard Worker 254*d57664e9SAndroid Build Coastguard Worker def commandArgAssert(self, linecomps, expectedcount, lineno): 255*d57664e9SAndroid Build Coastguard Worker foundcount = len(linecomps) - 1 256*d57664e9SAndroid Build Coastguard Worker if foundcount < expectedcount: 257*d57664e9SAndroid Build Coastguard Worker raise ParseError(lineno, "Not enough arguments specifed for command '%s'! Expected %d, " \ 258*d57664e9SAndroid Build Coastguard Worker "but got only %d!" % (linecomps[0], expectedcount, foundcount)) 259*d57664e9SAndroid Build Coastguard Worker elif foundcount > expectedcount + 1: 260*d57664e9SAndroid Build Coastguard Worker raise ParseError(lineno, "Too many arguments specifed for command '%s'! Expected %d, " \ 261*d57664e9SAndroid Build Coastguard Worker "but got %d!" % (linecomps[0], expectedcount, foundcount)) 262*d57664e9SAndroid Build Coastguard Worker 263*d57664e9SAndroid Build Coastguard Worker 264*d57664e9SAndroid Build Coastguard Worker def cStructString(self): 265*d57664e9SAndroid Build Coastguard Worker cfields = [f.cString() for f in self.fields] 266*d57664e9SAndroid Build Coastguard Worker return "typedef struct Struct%s {\n%s\n} %s;\n" % (self.structname,\ 267*d57664e9SAndroid Build Coastguard Worker "\n".join(cfields),\ 268*d57664e9SAndroid Build Coastguard Worker self.structname) 269*d57664e9SAndroid Build Coastguard Worker 270*d57664e9SAndroid Build Coastguard Worker def javaClassString(self): 271*d57664e9SAndroid Build Coastguard Worker jgetters = [f.javaGetter() for f in self.fields] 272*d57664e9SAndroid Build Coastguard Worker jsetters = [f.javaSetter() for f in self.fields] 273*d57664e9SAndroid Build Coastguard Worker jnativesetters = [f.javaNativeSetter() for f in self.fields] 274*d57664e9SAndroid Build Coastguard Worker jnativegetters = [f.javaNativeGetter() for f in self.fields] 275*d57664e9SAndroid Build Coastguard Worker return "public class %s extends NativeBuffer {\n\n"\ 276*d57664e9SAndroid Build Coastguard Worker " public %s() {\n"\ 277*d57664e9SAndroid Build Coastguard Worker " super();\n"\ 278*d57664e9SAndroid Build Coastguard Worker " }\n"\ 279*d57664e9SAndroid Build Coastguard Worker "\n"\ 280*d57664e9SAndroid Build Coastguard Worker " public %s(int count) {\n"\ 281*d57664e9SAndroid Build Coastguard Worker " super(count);\n"\ 282*d57664e9SAndroid Build Coastguard Worker " }\n"\ 283*d57664e9SAndroid Build Coastguard Worker "\n"\ 284*d57664e9SAndroid Build Coastguard Worker " public native int getElementSize();\n"\ 285*d57664e9SAndroid Build Coastguard Worker "\n"\ 286*d57664e9SAndroid Build Coastguard Worker "%s\n\n"\ 287*d57664e9SAndroid Build Coastguard Worker "%s\n\n"\ 288*d57664e9SAndroid Build Coastguard Worker "%s\n\n"\ 289*d57664e9SAndroid Build Coastguard Worker "%s\n\n"\ 290*d57664e9SAndroid Build Coastguard Worker " static {\n"\ 291*d57664e9SAndroid Build Coastguard Worker " System.loadLibrary(\"%s\");\n"\ 292*d57664e9SAndroid Build Coastguard Worker " }\n"\ 293*d57664e9SAndroid Build Coastguard Worker "\n"\ 294*d57664e9SAndroid Build Coastguard Worker "};\n" % (self.jclassname,\ 295*d57664e9SAndroid Build Coastguard Worker self.jclassname,\ 296*d57664e9SAndroid Build Coastguard Worker self.jclassname,\ 297*d57664e9SAndroid Build Coastguard Worker "\n\n".join(jgetters),\ 298*d57664e9SAndroid Build Coastguard Worker "\n\n".join(jsetters),\ 299*d57664e9SAndroid Build Coastguard Worker "\n\n".join(jnativegetters),\ 300*d57664e9SAndroid Build Coastguard Worker "\n\n".join(jnativesetters),\ 301*d57664e9SAndroid Build Coastguard Worker self.libname) 302*d57664e9SAndroid Build Coastguard Worker 303*d57664e9SAndroid Build Coastguard Worker def jniDeclString(self): 304*d57664e9SAndroid Build Coastguard Worker jnigetters = [f.jniGetterDefString() for f in self.fields] 305*d57664e9SAndroid Build Coastguard Worker jnisetters = [f.jniSetterDefString() for f in self.fields] 306*d57664e9SAndroid Build Coastguard Worker return "\n\n".join(jnigetters + jnisetters) 307*d57664e9SAndroid Build Coastguard Worker 308*d57664e9SAndroid Build Coastguard Worker def jniImplString(self): 309*d57664e9SAndroid Build Coastguard Worker jnigetters = [f.jniGetterImplString() for f in self.fields] 310*d57664e9SAndroid Build Coastguard Worker jnisetters = [f.jniSetterImplString() for f in self.fields] 311*d57664e9SAndroid Build Coastguard Worker return "\n\n".join(jnigetters + jnisetters) 312*d57664e9SAndroid Build Coastguard Worker 313*d57664e9SAndroid Build Coastguard Worker def hFileString(self): 314*d57664e9SAndroid Build Coastguard Worker defname = ToMacroDefName(self.structname, self.package) 315*d57664e9SAndroid Build Coastguard Worker return hFileTemplate % (defname, defname, self.cStructString(), defname) 316*d57664e9SAndroid Build Coastguard Worker 317*d57664e9SAndroid Build Coastguard Worker def javaFileString(self): 318*d57664e9SAndroid Build Coastguard Worker return javaFileTemplate % (self.package, self.javaClassString()) 319*d57664e9SAndroid Build Coastguard Worker 320*d57664e9SAndroid Build Coastguard Worker def jniFileString(self): 321*d57664e9SAndroid Build Coastguard Worker return jniFileTemplate % (self.structname.lower(),\ 322*d57664e9SAndroid Build Coastguard Worker self.structname,\ 323*d57664e9SAndroid Build Coastguard Worker self.structname,\ 324*d57664e9SAndroid Build Coastguard Worker self.structname,\ 325*d57664e9SAndroid Build Coastguard Worker self.structname,\ 326*d57664e9SAndroid Build Coastguard Worker ToJNIPackage(self.package, self.jclassname),\ 327*d57664e9SAndroid Build Coastguard Worker self.jniDeclString(),\ 328*d57664e9SAndroid Build Coastguard Worker ToJNIPackage(self.package, self.jclassname),\ 329*d57664e9SAndroid Build Coastguard Worker self.structname, 330*d57664e9SAndroid Build Coastguard Worker self.jniImplString()) 331*d57664e9SAndroid Build Coastguard Worker 332*d57664e9SAndroid Build Coastguard Workerdef main(argv): 333*d57664e9SAndroid Build Coastguard Worker if len(argv) != 2: 334*d57664e9SAndroid Build Coastguard Worker print("Usage: %s <file.struct>" % argv[0]) 335*d57664e9SAndroid Build Coastguard Worker return -1 336*d57664e9SAndroid Build Coastguard Worker 337*d57664e9SAndroid Build Coastguard Worker filepath = argv[1] 338*d57664e9SAndroid Build Coastguard Worker 339*d57664e9SAndroid Build Coastguard Worker structspec = StructSpec() 340*d57664e9SAndroid Build Coastguard Worker structspec.parseTextFile(filepath) 341*d57664e9SAndroid Build Coastguard Worker 342*d57664e9SAndroid Build Coastguard Worker hfilename = "%s.h" % structspec.structname.lower() 343*d57664e9SAndroid Build Coastguard Worker javafilename = "%s.java" % structspec.jclassname 344*d57664e9SAndroid Build Coastguard Worker jnifilename = "jni_%s.c" % structspec.structname.lower() 345*d57664e9SAndroid Build Coastguard Worker 346*d57664e9SAndroid Build Coastguard Worker javapackagepath = structspec.package.replace('.','/') 347*d57664e9SAndroid Build Coastguard Worker 348*d57664e9SAndroid Build Coastguard Worker rootdir = os.path.dirname(filepath) 349*d57664e9SAndroid Build Coastguard Worker hfilepath = "%s/../native/%s" % (rootdir, hfilename) 350*d57664e9SAndroid Build Coastguard Worker javafilepath = "%s/../java/%s/%s" % (rootdir, javapackagepath, javafilename) 351*d57664e9SAndroid Build Coastguard Worker jnifilepath = "%s/../jni/%s" % (rootdir, jnifilename) 352*d57664e9SAndroid Build Coastguard Worker 353*d57664e9SAndroid Build Coastguard Worker hfile = open(hfilepath, 'w') 354*d57664e9SAndroid Build Coastguard Worker hfile.write(structspec.hFileString()) 355*d57664e9SAndroid Build Coastguard Worker hfile.close() 356*d57664e9SAndroid Build Coastguard Worker 357*d57664e9SAndroid Build Coastguard Worker javafile = open(javafilepath, 'w') 358*d57664e9SAndroid Build Coastguard Worker javafile.write(structspec.javaFileString()) 359*d57664e9SAndroid Build Coastguard Worker javafile.close() 360*d57664e9SAndroid Build Coastguard Worker 361*d57664e9SAndroid Build Coastguard Worker jnifile = open(jnifilepath, 'w') 362*d57664e9SAndroid Build Coastguard Worker jnifile.write(structspec.jniFileString()) 363*d57664e9SAndroid Build Coastguard Worker jnifile.close() 364*d57664e9SAndroid Build Coastguard Worker 365*d57664e9SAndroid Build Coastguard Worker 366*d57664e9SAndroid Build Coastguard Workerif __name__ == "__main__": 367*d57664e9SAndroid Build Coastguard Worker sys.exit(main(sys.argv)) 368