summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--db/db.cpp4
-rw-r--r--db/db.h2
-rw-r--r--db/javajs.cpp62
-rw-r--r--db/javajs.h17
-rw-r--r--grid/message.h1
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());
diff --git a/db/db.h b/db/db.h
index 648f027acf7..11df40dca97 100644
--- a/db/db.h
+++ b/db/db.h
@@ -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;