diff options
-rw-r--r-- | db/db.cpp | 4 | ||||
-rw-r--r-- | db/db.h | 2 | ||||
-rw-r--r-- | db/javajs.cpp | 62 | ||||
-rw-r--r-- | db/javajs.h | 17 | ||||
-rw-r--r-- | grid/message.h | 1 |
5 files changed, 73 insertions, 13 deletions
diff --git a/db/db.cpp b/db/db.cpp index 03ba5e0adf5..5bdd4605b9c 100644 --- a/db/db.cpp +++ b/db/db.cpp @@ -287,7 +287,7 @@ public: void reply(Message& received, Message& response) {
container = response;
}
- Message container;
+ Message & container;
};
/* a call from java/js to the database locally.
@@ -550,7 +550,7 @@ void msg(const char *m, int extras = 0) { int main(int argc, char* argv[], char *envp[] )
{
JavaJS = new JavaJSImpl();
- //javajstest();
+ javajstest();
srand(curTimeMillis());
@@ -1,2 +1,4 @@ #include "../stdafx.h"
+#include "../grid/message.h"
+void jniCallback(Message& m, Message& out);
diff --git a/db/javajs.cpp b/db/javajs.cpp index d40e33bff96..d244b337164 100644 --- a/db/javajs.cpp +++ b/db/javajs.cpp @@ -19,6 +19,9 @@ using namespace boost::filesystem; #pragma message("warning: including jsobj.h") #endif +#include "../grid/message.h" +#include "db.h" + using namespace std; #if defined(_WIN32)
@@ -134,9 +137,12 @@ JavaJSImpl::JavaJSImpl(){ _dbhook = findClass( "ed/db/JSHook" ); if( _dbhook == 0 ) - cout << "using classpath: " << q << endl; + cout << "using classpath: " << q << endl; jassert( _dbhook ); + _dbjni = findClass( "ed/db/DBJni" ); + jassert( _dbjni ); + _scopeCreate = _mainEnv->GetStaticMethodID( _dbhook , "scopeCreate" , "()J" ); _scopeReset = _mainEnv->GetStaticMethodID( _dbhook , "scopeReset" , "(J)Z" ); _scopeFree = _mainEnv->GetStaticMethodID( _dbhook , "scopeFree" , "(J)V" ); @@ -174,6 +180,19 @@ JavaJSImpl::JavaJSImpl(){ jassert( _functionCreate ); jassert( _invoke ); + + JNINativeMethod * nativeSay = new JNINativeMethod(); + nativeSay->name = (char*)"native_say"; + nativeSay->signature = (char*)"(Ljava/nio/ByteBuffer;)V"; + nativeSay->fnPtr = (void*)java_native_say; + _mainEnv->RegisterNatives( _dbjni , nativeSay , 1 ); + + + JNINativeMethod * nativeCall = new JNINativeMethod(); + nativeCall->name = (char*)"native_call"; + nativeCall->signature = (char*)"(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I"; + nativeCall->fnPtr = (void*)java_native_call; + _mainEnv->RegisterNatives( _dbjni , nativeCall , 1 ); } @@ -200,6 +219,10 @@ void JavaJSImpl::scopeFree( jlong id ){ // scope setters +int JavaJSImpl::scopeSetBoolean( jlong id , const char * field , jboolean val ) { + return _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetNumber , id , _getEnv()->NewStringUTF( field ) , val ); +} + int JavaJSImpl::scopeSetNumber( jlong id , const char * field , double val ){ return _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetNumber , id , _getEnv()->NewStringUTF( field ) , val ); } @@ -221,10 +244,18 @@ int JavaJSImpl::scopeSetObject( jlong id , const char * field , JSObj * obj ){ // scope getters +char JavaJSImpl::scopeGetType( jlong id , const char * field ){ + return _getEnv()->CallStaticByteMethod( _dbhook , _scopeGetType , id , _getEnv()->NewStringUTF( field ) ); +} + double JavaJSImpl::scopeGetNumber( jlong id , const char * field ){ return _getEnv()->CallStaticDoubleMethod( _dbhook , _scopeGetNumber , id , _getEnv()->NewStringUTF( field ) ); } +jboolean JavaJSImpl::scopeGetBoolean( jlong id , const char * field ){ + return _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeGetBoolean , id , _getEnv()->NewStringUTF( field ) ); +} + string JavaJSImpl::scopeGetString( jlong id , const char * field ) { jstring s = (jstring)_getEnv()->CallStaticObjectMethod( _dbhook , _scopeGetString , id , _getEnv()->NewStringUTF( field ) ); if ( ! s ) @@ -336,6 +367,35 @@ const char * findEd(){ #endif }; +// --- + +JNIEXPORT void JNICALL java_native_say(JNIEnv * env , jclass, jobject outBuffer ){ + cerr << "native say called!" << endl; + + Message out( env->GetDirectBufferAddress( outBuffer ) , false ); + Message in; + + jniCallback( out , in ); +} + +JNIEXPORT jint JNICALL java_native_call(JNIEnv * env , jclass, jobject outBuffer , jobject inBuffer ){ + cerr << "native call called!" << endl; + + Message out( env->GetDirectBufferAddress( outBuffer ) , false ); + Message in; + + jniCallback( out , in ); + + cerr << "in.data : " << in.data << endl; + if ( in.data && in.data->len > 0 ){ + cerr << "copying data of len :" << in.data->len << endl; + memcpy( env->GetDirectBufferAddress( inBuffer ) , in.data , in.data->len ); + return in.data->len; + } + + return 0; +} + // ---- int javajstest() { diff --git a/db/javajs.h b/db/javajs.h index c1ed3ad8ed3..e78158d756c 100644 --- a/db/javajs.h +++ b/db/javajs.h @@ -37,21 +37,15 @@ class JavaJSImpl { double scopeGetNumber( jlong id , const char * field ); string scopeGetString( jlong id , const char * field ); - jboolean scopeGetBoolean( jlong id , const char * field ){ - return _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeGetBoolean , id , _getEnv()->NewStringUTF( field ) ); - } + jboolean scopeGetBoolean( jlong id , const char * field ); JSObj scopeGetObject( jlong id , const char * field ); - char scopeGetType( jlong id , const char * field ){ - return _getEnv()->CallStaticByteMethod( _dbhook , _scopeGetType , id , _getEnv()->NewStringUTF( field ) ); - } + char scopeGetType( jlong id , const char * field ); int scopeSetNumber( jlong id , const char * field , double val ); int scopeSetString( jlong id , const char * field , const char * val ); int scopeSetObject( jlong id , const char * field , JSObj * obj ); - int scopeSetBoolean( jlong id , const char * field , jboolean val ) { - return _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetNumber , id , _getEnv()->NewStringUTF( field ) , val ); - } - + int scopeSetBoolean( jlong id , const char * field , jboolean val ); + jlong functionCreate( const char * code ); /* return values: @@ -100,6 +94,7 @@ class JavaJSImpl { boost::thread_specific_ptr<JNIEnv> * _envs; jclass _dbhook; + jclass _dbjni; jmethodID _scopeCreate; jmethodID _scopeReset; @@ -148,3 +143,5 @@ class Scope { jlong s; }; +JNIEXPORT void JNICALL java_native_say(JNIEnv *, jclass, jobject outBuffer ); +JNIEXPORT jint JNICALL java_native_call(JNIEnv *, jclass, jobject outBuffer , jobject inBuffer ); diff --git a/grid/message.h b/grid/message.h index 92691b65f61..1395fa51e0a 100644 --- a/grid/message.h +++ b/grid/message.h @@ -82,6 +82,7 @@ inline int MsgData::dataLen() { return len - MsgDataHeaderSize; } class Message {
public:
Message() { data = 0; freeIt = false; }
+ Message( void * _data , bool _freeIt ){ data = (MsgData*)_data; freeIt = _freeIt; };
~Message() { reset(); }
SockAddr from;
|