[vmkit-commits] [vmkit] r142845 - in /vmkit/trunk/lib/J3/VMCore: Jni.cpp JnjvmClassLoader.cpp JnjvmClassLoader.h

Will Dietz wdietz2 at illinois.edu
Mon Oct 24 14:09:53 PDT 2011


Author: wdietz2
Date: Mon Oct 24 16:09:53 2011
New Revision: 142845

URL: http://llvm.org/viewvc/llvm-project?rev=142845&view=rev
Log:
Implement basic registerNatives support.

Store the registred native function pointer in the class's classloader.

Modified:
    vmkit/trunk/lib/J3/VMCore/Jni.cpp
    vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h

Modified: vmkit/trunk/lib/J3/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jni.cpp?rev=142845&r1=142844&r2=142845&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jni.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Jni.cpp Mon Oct 24 16:09:53 2011
@@ -3755,11 +3755,42 @@
 }
 
 
-jint RegisterNatives(JNIEnv *env, jclass clazz, const JNINativeMethod *methods,
+jint RegisterNatives(JNIEnv *env, jclass _clazz, const JNINativeMethod *methods,
 		     jint nMethods) {
-  NYI();
-  abort();
-  return 0;
+  BEGIN_JNI_EXCEPTION
+
+  JavaObject * clazz = 0;
+  llvm_gcroot(clazz, 0);
+  clazz = *(JavaObject**)_clazz;
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  UserCommonClass * Cl = UserCommonClass::resolvedImplClass(vm, clazz, false);
+  // TODO: Don't assert, throw exceptions!
+  assert(Cl);
+  UserClass * cl = Cl->asClass();
+
+  for(int i = 0; i < nMethods; ++i)
+  {
+    const UTF8* name = cl->classLoader->hashUTF8->lookupAsciiz(methods[i].name);
+    const UTF8* sign = cl->classLoader->hashUTF8->lookupAsciiz(methods[i].signature);
+    assert(name);
+    assert(sign);
+
+    JavaMethod * meth = cl->lookupMethodDontThrow(name, sign, true, true, 0);
+    if (!meth) meth = cl->lookupMethodDontThrow(name, sign, false, true, 0);
+
+    // TODO: Don't assert, throw exceptions!
+    assert(meth);
+    assert(isNative(meth->access));
+
+    cl->classLoader->registerNative(meth,(word_t)methods[i].fnPtr);
+  }
+
+  RETURN_FROM_JNI(0)
+
+  END_JNI_EXCEPTION
+
+  RETURN_FROM_JNI(0)
 }
 
 

Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp?rev=142845&r1=142844&r2=142845&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp Mon Oct 24 16:09:53 2011
@@ -1005,9 +1005,19 @@
 word_t JnjvmClassLoader::nativeLookup(JavaMethod* meth, bool& j3,
                                         char* buf) {
 
+  word_t res;
+
+  // Is this method defined via registerNatives()?
+  // If so, use that definition.
+  if (res = getRegisteredNative(meth))
+    return res;
+
+  // Otherwise, try to resolve the method with a symbol lookup
+  // First as the base method
   meth->jniConsFromMeth(buf);
-  word_t res = loadInLib(buf, j3);
+  res = loadInLib(buf, j3);
   if (!res) {
+    // Failing that, try the overloaded symbol name
     meth->jniConsFromMethOverloaded(buf);
     res = loadInLib(buf, j3);
   }
@@ -1031,3 +1041,19 @@
     return res;
   }
 }
+
+void JnjvmClassLoader::registerNative(JavaMethod * meth, word_t fnPtr) {
+  lock.lock();
+  // Don't support multiple levels of registerNatives
+  assert(registeredNatives.find(meth) == registeredNatives.end());
+
+  registeredNatives[meth] = fnPtr;
+  lock.unlock();
+}
+
+word_t JnjvmClassLoader::getRegisteredNative(const JavaMethod * meth) {
+  lock.lock();
+  word_t res = registeredNatives[meth];
+  lock.unlock();
+  return res;
+}

Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h?rev=142845&r1=142844&r2=142845&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h Mon Oct 24 16:09:53 2011
@@ -108,6 +108,11 @@
   ///
   mvm::LockRecursive lock;
 
+  /// registeredNatives - Stores the native function pointers corresponding
+  /// to methods that were defined through JNI's RegisterNatives mechanism.
+  ///
+  std::map<const JavaMethod*,word_t> registeredNatives;
+
 public:
   
   /// allocator - Reference to the memory allocator, which will allocate UTF8s,
@@ -301,6 +306,14 @@
   ///
   Class* loadClassFromSelf(Jnjvm* vm, const char* name);
 
+  /// registerNative - Record the native function pointer of a method.
+  ///
+  void registerNative(JavaMethod * meth, word_t fnPtr);
+
+  /// getRegisteredNative - Return the native pointer, if exists.
+  ///
+  word_t getRegisteredNative(const JavaMethod * meth);
+
   friend class Class;
   friend class CommonClass;
   friend class StringList;





More information about the vmkit-commits mailing list