jni.cpp
2.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//Need to include location of jvm.dll (jdk version) and its parent directory in the environment variables
#include <limits>
#include "openbr_internal.h"
#include "openbr/core/resource.h"
#include <jni.h>
namespace br
{
/*!
* \ingroup initializers
* \brief Initialize JNI
* \author Jordan Cheney \cite jcheney
*/
class JNIInitializer : public Initializer
{
Q_OBJECT
public:
static JavaVM* jvm;
static JavaVMInitArgs vm_args;
void initialize() const
{
JNIEnv *env;
JavaVMOption options[1];
//Location of Java files
QByteArray classpath = QString("-Djava.class.path=").append(Globals->sdkPath).append(QString("/share/openbr/Java/jniLibraries/")).toLocal8Bit();
char *charClasspath = classpath.data();
options[0].optionString = charClasspath;
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_FALSE;
JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
Globals->abbreviations.insert("JNIHelloWorld","Open+JNI(HelloWorld)");
}
void finalize() const
{
jvm->DestroyJavaVM();
}
};
JavaVM *JNIInitializer::jvm;
JavaVMInitArgs JNIInitializer::vm_args;
BR_REGISTER(Initializer, JNIInitializer)
/*!
* \ingroup transforms
* \brief Execute Java code from OpenBR using the JNI
* \author Jordan Cheney \cite jcheney
*/
class JNITransform : public UntrainableTransform
{
Q_OBJECT
Q_PROPERTY(QString className READ get_className WRITE set_className RESET reset_className STORED false)
BR_PROPERTY(QString, className, "")
void project(const Template &src, Template &dst) const
{
(void)dst; //Eliminates a compiler warning.
JNIEnv *env;
//Attach current thread to the thread of the JavaVM and access env
JNIInitializer::jvm->AttachCurrentThreadAsDaemon((void**)&env, NULL);
if (JNIInitializer::jvm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
qFatal("Failed to initialize JNI environment");
}
//Convert QString to const char*
QByteArray tmpClass = className.toLocal8Bit();
const char* charClassName = tmpClass.constData();
//Call java method
jclass cls = env->FindClass(charClassName);
if (cls == NULL) { qFatal("Class not found"); }
jmethodID mid = env->GetStaticMethodID(cls, "project", "(Ljava/lang/String;)V");
if (mid == NULL) { qFatal("MethodID not found"); }
QByteArray tmp = src.file.name.toLocal8Bit();
const char* fileName = tmp.constData();
//Convert char* to java compatible string
jstring jfileName = env->NewStringUTF(fileName);
env->CallStaticObjectMethod(cls, mid, jfileName);
JNIInitializer::jvm->DetachCurrentThread();
}
};
BR_REGISTER(Transform, JNITransform)
} // namespace br
#include "jni.moc"