java


JNI - Listener in C++/Java - is it possible to instantiate Java objects in c++ and use them as parameters


Is the following usable with JNI?
public NativeClass {
static {
System.loadLibrary("dll");
}
public static native void addListener(Listener listener);
}
public interface Listener {
public void eventOccurred(Info info);
}
public Info {
private final String s1;
private final String s2;
public Info(String s1, String s2);
// ... getters for use in Java
}
Is it possible to
register a Listener object on a dll (should be no problem, as far as I found out)
instantiate an Info object in the c/c++ code and use it as a parameter for calling Listener.eventOccured(Info...)?
Or what would be a good way to implement a listener which gets some information from a DLL?
In my case - we have a dll wich does some work. We call this dll from java. Now we want to attach a listener to the dll, to push us some progress information while working. The above example is the listener part, which I don't know if it is possible regarding the constructor call to a Java constructor from c/c++.
A hint where to find a piece of documentation, which describes the answer would be nice - I could not find infos, which answered my question.
A small snippet of code, describing the c/c++ part would be the icing on the cake :)

The short answer is yes, you can hold, instantiate, and pass Java objects in a native layer via JNI.
In the jni documentation, you will find functions that will do this for you.
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html
You will also Use javap -s and javah to assist in finding your java method signatures for use in jni and to make your jni headers. See http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javap.html & http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javah.html
Here is a sample of what you will be doing. I haven't tested it, so just use it as a reference for writing your own. Note: be aware of package notations(I've assumed no package) & Exceptions. Exceptions can happen on any JNI call(env->...), so check the documentation on how to deal with exceptions(ExceptionCheck, ExceptionDescribe, ExceptionClear).
JavaVM * savedVM = NULL;
JNIEXPORT void JNICALL Java_NativeClass_addListener(JNIEnv *env, jobject obj_instance, jobject listener_instance)
{
env->GetJavaVM( &savedVM );
//save listener_instance for use later
saved_listener_instance = listener_instance;
}
void doSomething()
{
//Get current thread JNIEnv
JNIEnv * ENV;
int stat = savedVM->GetEnv((void **)&ENV, JNI_VERSION_1_6);
if (stat == JNI_EDETACHED) //We are on a different thread, attach
savedVM->AttachCurrentThread((void **) &ENV, NULL);
if( ENV == NULL )
return; //Cant attach to java, bail
//Get the Listener class reference
jclass listenerClassRef = ENV->GetObjectClass( saved_listener_instance );
//Use Listener class reference to load the eventOccurred method
jmethodID listenerEventOccured = ENV->GetMethodID( listenerClassRef, "eventOccurred", "(LInfo;)V" );
//Get Info class reference
jclass infoClsRef = ENV->FindClass( "Info" );
//Create Info class
jobject info_instance = ENV->NewObject( infoClsRef, ..... );//For you to fill in with your arguments
//invoke listener eventOccurred
ENV->CallVoidMethod( saved_listener_instance, listenerEventOccured, info_instance );
//Cleanup
ENV->DeleteLocalRef( info_instance );
}


Related Links

Java lambda filter and map, can I avoid these repetitive calls?
JavaFX: display text instead of boolean value (true/false)
CMIS file size download limits?
Spring + Angular Http Cache Not Clearing
Cast a Collection of <T> by T.class
How to get length of int from user input in java
Execute maven goal without a project
OddEven Linked List code doesnt work on leetcode
Displaying data in a jTable
Creating encrypted Zip files that are compatible with the TrueZip Java Library (Winzip AES?)
Java mysql Lock table for new insert
Java 8 Stream API Collector - addAll not applicable for argument Object, addAll is undefined for type Object
wrong timezone with clock and jackson
How can I get the page number for a specific field in iText?
Checking size of SQS message batches
Reading pdf ebook's contents and split pdf file accordingly

Categories

HOME
client
gitlab
sqlite-net-extensions
paw-app
retrofit
node-notifier
android-youtube-api
basic
amazon-cloudformation
spring-kafka
row
event-handling
transformation
plunker
rundeck
bootstrap-duallistbox
xacml
procdump
srcset
nat
commit
android-nestedscrollview
mapdb
catalog
jmonkeyengine
revolution-slider
devextreme
bootstrapper
greenrobot-eventbus
quadratic-programming
gpx
s
multipeer-connectivity
logparser
return-value
integrity
svmlight
google-perftools
dtexec
capacity
nbconvert
spring-mongodb
lync-client-sdk
nested-sets
savon
xml-attribute
autorest
markojs
qgraphicsview
jfugue
unity-networking
rtbkit
srand
mutation-observers
sniffer
p2
sonarqube5.1.2
device-orientation
camanjs
javafx-webengine
device-manager
preferences
xojo
mesa
android-radiobutton
fluentautomation
reactfx
braille
mbr
ivyde
cdc
ora-00911
type-equivalence
pvrtc
gdata-api
venn-diagram
manchester-syntax
amazon-appstore
hgsubversion
custom-backend
boost-filesystem
fireworks
gnu-prolog
propagation
floating
telerik-scheduler
site.master
gamequery
revisions
compiler-specific
photoshop-cs4





Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization