127 lines
4.7 KiB
OpenEdge ABL
127 lines
4.7 KiB
OpenEdge ABL
|
|
/* Copyright (c) 2015,2016 Sequence Logic Inc. All rights reserved
|
||
|
|
*
|
||
|
|
* SWIG interface for the cppcore, wraps the interfaces
|
||
|
|
* Uses SWIG "directors", to allow C++ to call back into Java for the observer and
|
||
|
|
* network service classes.
|
||
|
|
*
|
||
|
|
* Be aware, ordering of SWIG directives is ORDER DEPENDENT.
|
||
|
|
*/
|
||
|
|
|
||
|
|
%module(directors="1", assumeoverride=1) cppcore
|
||
|
|
|
||
|
|
%pragma(java) jniclassimports=%{
|
||
|
|
import java.util.Date;
|
||
|
|
%}
|
||
|
|
|
||
|
|
%include "stl.i"
|
||
|
|
|
||
|
|
%include "sequencelogic-collaborator.i"
|
||
|
|
%include "sequencelogic-json.i"
|
||
|
|
%include "sequencelogic-cgurn.i"
|
||
|
|
%include "sequencelogic-misc.i"
|
||
|
|
%include "sequencelogic-file.i"
|
||
|
|
|
||
|
|
%typemap(out) std::shared_ptr<std::vector<std::string> > {
|
||
|
|
// This may look strange, but SWIG insists on wrapping the return value in their
|
||
|
|
// SwigValueWrapper template class. Unfortunately, adding the line:
|
||
|
|
// %feature("novaluewrapper") std::shared_ptr<std::vector<std::string> >;
|
||
|
|
// Doesn't seem to work. I'm probably being too cute with my code.
|
||
|
|
std::shared_ptr<std::vector<std::string> > pRes = *(&result);
|
||
|
|
if (pRes == NULL)
|
||
|
|
{
|
||
|
|
SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "NULL std::shared_ptr<std::vector<std::string> >");
|
||
|
|
return $null;
|
||
|
|
}
|
||
|
|
|
||
|
|
size_t nLen = pRes->size();
|
||
|
|
const jclass jStringClass = jenv->FindClass("java/lang/String");
|
||
|
|
jresult = jenv->NewObjectArray(static_cast<jsize>(nLen), jStringClass, NULL);
|
||
|
|
for (unsigned int i = 0; i < nLen; ++i)
|
||
|
|
{
|
||
|
|
jstring tmpStr = jenv->NewStringUTF(pRes->at(i).c_str());
|
||
|
|
jenv->SetObjectArrayElement(jresult, i, tmpStr);
|
||
|
|
jenv->DeleteLocalRef(tmpStr);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
%typemap(jni) std::shared_ptr<std::vector<std::string> > "jobjectArray"
|
||
|
|
%typemap(jtype) std::shared_ptr<std::vector<std::string> > "String []"
|
||
|
|
%typemap(jstype) std::shared_ptr<std::vector<std::string> > "String []"
|
||
|
|
|
||
|
|
%typemap(directorin, descriptor="[Ljava/lang/String;") std::shared_ptr<std::vector<std::string> > "$input = (jobjectArray) $1;"
|
||
|
|
%typemap(javadirectorout) std::shared_ptr<std::vector<std::string> > "$javacall"
|
||
|
|
%typemap(directorout) std::shared_ptr<std::vector<std::string> > {
|
||
|
|
// This may look strange, but SWIG insists on wrapping the return value in their
|
||
|
|
// SwigValueWrapper template class. Unfortunately, adding the line:
|
||
|
|
// %feature("novaluewrapper") std::shared_ptr<std::vector<std::string> >;
|
||
|
|
// Doesn't seem to work. I'm probably being too cute with my code.
|
||
|
|
std::shared_ptr<std::vector<std::string> > *pRes = (&c_result);
|
||
|
|
pRes->reset(new std::vector<std::string>());
|
||
|
|
|
||
|
|
unsigned int nLen = jenv->GetArrayLength(jresult);
|
||
|
|
for (unsigned int i = 0; i < nLen; ++i)
|
||
|
|
{
|
||
|
|
jstring tmpStr = static_cast<jstring>(jenv->GetObjectArrayElement(jresult, i));
|
||
|
|
const char *pStr = jenv->GetStringUTFChars(tmpStr, 0);
|
||
|
|
(*pRes)->push_back(pStr);
|
||
|
|
jenv->ReleaseStringUTFChars(tmpStr, pStr);
|
||
|
|
jenv->DeleteLocalRef(tmpStr);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
%typemap(javain) std::shared_ptr<std::vector<std::string> > "$javainput"
|
||
|
|
%typemap(javaout) std::shared_ptr<std::vector<std::string> > {
|
||
|
|
return $jnicall;
|
||
|
|
}
|
||
|
|
|
||
|
|
%header %{
|
||
|
|
/** #include "client/syncandmessagedisp.h" **/
|
||
|
|
#include "client/vanaccess.h"
|
||
|
|
#include "component/storagenodedbaccess_java.h"
|
||
|
|
|
||
|
|
using namespace sequencelogic;
|
||
|
|
%}
|
||
|
|
|
||
|
|
/* It seems that SWIG allows you to add code to the generated CPP/Java files
|
||
|
|
but **not** the generated header files. Bummer. These lines need to be added
|
||
|
|
to the generated ionu-samdjni.h file. */
|
||
|
|
/*
|
||
|
|
update cppcorejni.h: {
|
||
|
|
#include "client/peerobserver.h"
|
||
|
|
#include "client/websvcs.h"
|
||
|
|
} */
|
||
|
|
|
||
|
|
/** %feature("director") PeerObserver;
|
||
|
|
%feature("director") WebSvcs; **/
|
||
|
|
|
||
|
|
/** %include "client/peerobserver.h"
|
||
|
|
%include "client/websvcs.h"
|
||
|
|
%include "client/syncandmessagedisp.h" */
|
||
|
|
%include "client/vanaccess.h"
|
||
|
|
%include "component/storagenodedbaccess_java.h"
|
||
|
|
|
||
|
|
%pragma(java) jniclassimports=%{
|
||
|
|
import java.util.Date;
|
||
|
|
%}
|
||
|
|
|
||
|
|
%pragma(java) jniclasscode=%{
|
||
|
|
// bootstrap JNI/Lib
|
||
|
|
static {
|
||
|
|
System.out.println("[JAVA] " + new Date() + " cppcore static init");
|
||
|
|
Exception here = new Exception("YOU ARE HERE: " + cppcore.class.getClassLoader());
|
||
|
|
here.fillInStackTrace();
|
||
|
|
System.out.println("LD_LIBRARY_PATH (Linux): " + System.getenv("LD_LIBRARY_PATH"));
|
||
|
|
System.out.println("DYLD_LIBRARY_PATH (OSX): " + System.getenv("DYLD_LIBRARY_PATH"));
|
||
|
|
try
|
||
|
|
{
|
||
|
|
System.out.println("[JAVA] " + new Date() + " Loading cppcore... " + System.getProperty("java.library.path"));
|
||
|
|
System.loadLibrary("cppcore");
|
||
|
|
System.out.println("[JAVA] " + new Date() + " cppcore Loaded native libraries!");
|
||
|
|
}
|
||
|
|
catch (Throwable ex){
|
||
|
|
System.err.println("[JAVA] " + new Date() + " FATAL: cppcore Unable to load shared library: " + ex.getMessage());
|
||
|
|
ex.printStackTrace();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
%}
|