--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/build/buildutils/generates60lookup.py Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,113 @@
+#! /usr/bin/python
+#
+# Copyright (c) 2009,2010 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys, traceback, os, re, os.path
+from optparse import OptionParser
+
+# JNIEXPORT void JNICALL Java_com_...... (JNIEnv *, ....);
+RE_JNIDECL = re.compile(r"JNIEXPORT\s+\w+\s+JNICALL\s+(\w+)\s+ \([\s\w,\*]+\);")
+
+def getJniFunctions(javah):
+ ''' Reads all .h files from hDir and returns the header file names and
+ JNI functions found on the file '''
+
+ if os.path.isdir(javah):
+ # Find all headers in javah
+ headers = [os.path.join(javah, h)
+ for h in os.listdir(javah) if h.endswith(".h")]
+
+ elif os.path.isfile(javah):
+ headers = [javah]
+
+ else:
+ raise Exception("Could not find %s" % javah)
+
+ # Find all JNI functions in header files
+ jniFunctions = []
+ for headerFile in headers:
+ content = open(headerFile).read()
+ jniFunctions.extend(RE_JNIDECL.findall(content))
+
+ return [os.path.basename(h) for h in headers], jniFunctions
+
+def writeLookup(lookupFile, headers, jniFunctions, jxeLookup):
+ ''' Writes the lookupfile, generated from given headers and jni functions '''
+
+ # File header
+ content = r'''/*
+ * Description: Automatically generated JNI lookup file. Do not modify manually.
+ */
+
+#include "javasymbianoslayer.h"
+typedef void (*TFunc)();
+'''
+
+ if jxeLookup:
+ # Add the J9GetJXE getter as part of JNI functions
+ jniFunctions.append("J9GetJXE")
+
+ content = content + r'''
+#include "j9comp.h"
+extern "C" {
+ extern const U_64 j9Jar[];
+
+ void* J9GetJXE() {
+ return const_cast<void*>(reinterpret_cast<const void*>(j9Jar));
+ }
+}
+'''
+
+ # Header includes
+ content = content + "\n".join(['#include "%s"' % h for h in headers])
+
+ # Sorted lookup table
+ content = content + "\nconst FuncTable funcTable[] = {\n"
+ content = content + ",\n".join([' { "%s", (unsigned int) %s}' %
+ (jni, jni) for jni in sorted(jniFunctions)])
+ content = content + "\n};\n"
+
+ # Jnilookup method
+ content = content + r'''
+IMPORT_C TFunc jni_lookup(const char* name);
+EXPORT_C TFunc jni_lookup(const char* name) {
+ return (TFunc)findMethod(name, funcTable, sizeof(funcTable)/sizeof(FuncTable));
+}
+'''
+
+ # Write file
+ open(lookupFile, "w").write(content)
+
+
+def main():
+ parser = OptionParser(usage = "%prog [options] javah-file-or-dir lookup-source.cpp")
+ parser.add_option("--nojxe", dest = "jxeLookup",
+ help = "Do not generate JXE lookup code",
+ action = "store_false", default = True)
+ (options, args) = parser.parse_args()
+ try:
+ javah, lookupFile = args
+
+ headers, jniFunctions = getJniFunctions(javah)
+ writeLookup(lookupFile, headers, jniFunctions, options.jxeLookup)
+
+ except:
+ print "Error during lookup file generation!"
+ traceback.print_exc()
+ sys.exit(-1)
+
+if __name__ == "__main__":
+ main()