[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