Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / June 2005

Tip: Looking for answers? Try searching our database.

Calling a Java method from C++ via JNI problem.

Thread view: 
Sambucus - 28 Jun 2005 10:48 GMT
Hi all,
I am having some real difficulties calling a Java method from C++
code.

I load my c++ dll from java using:

static {
        System.loadLibrary("libname");
    }

I then init the dll by calling a method in the c++ dll like this:
(trying to save the references for env and obj)

static JNIEnv *jEnv;
static jobject jObj;

JNIEXPORT void JNICALL Java_poker_jni_JavaClassName_init(JNIEnv *env,
jobject obj){
        jEnv = env;
        jObj = env->NewGlobalRef(obj);
}

I have a function in my dll which I want to call a method (void
doTextOut(int i)) in my Java class that loaded the dll, it looks like
this:

void update(){

    jclass cls = jEnv->GetObjectClass(jObj);
    jmethodID mid = jEnv->GetMethodID(cls, "doTextOut", "(I)V");
    jEnv->CallVoidMethod(jObj, mid);

}

this method is called from my WndProc callback function.

When I do this the JVM will crash.

If I try to do exactly the same thing as update() in the JNIEXPORT
void JNICALL Java_poker_jni_JavaClassName_init(JNIEnv *env, jobject
obj) function it works!?! But the thing is that I really need to do it
from update()

Any suggestion on what I am doing wrong, or is this something that is
not even possible to do with JNI?

Any help would be greatly appreciated!

Best Regards
AET
Gordon Beaton - 28 Jun 2005 12:00 GMT
> I then init the dll by calling a method in the c++ dll like this:
> (trying to save the references for env and obj)
[quoted text clipped - 7 lines]
>         jObj = env->NewGlobalRef(obj);
> }

Don't attempt to save the JNIEnv pointer for use from a different
context, it will crash as you have discovered. Read the documentation
for the invocation API (at the end of the JNI spec) for information
about this.

Saving the object reference is ok, just remember to release the global
reference when you no longer need it.

> I have a function in my dll which I want to call a method (void
> doTextOut(int i)) in my Java class that loaded the dll, it looks
[quoted text clipped - 5 lines]
>     jEnv->CallVoidMethod(jObj, mid);
> }

You need to attach "this" thread to the JVM to get a valid JNIEnv* for
use in this context. Use JNI_GetCreatedJavaVMs() and
AttachCurrentThread(), part of the invocation API.

/gordon

Signature

[  do not email me copies of your followups  ]
g o r d o n + n e w s @  b a l d e r 1 3 . s e

castillo.bryan@gmail.com - 28 Jun 2005 15:57 GMT
> > I then init the dll by calling a method in the c++ dll like this:
> > (trying to save the references for env and obj)
[quoted text clipped - 29 lines]
> use in this context. Use JNI_GetCreatedJavaVMs() and
> AttachCurrentThread(), part of the invocation API.

As an alternative you can also used the JNI_OnLoad function to save the
JavaVM pointer, instead of using JNI_GetCreatedJavaVMs.

http://java.sun.com/j2se/1.3/docs/guide/jni/jni-12.html#JNI_OnLoad

> /gordon
>
> --
> [  do not email me copies of your followups  ]
> g o r d o n + n e w s @  b a l d e r 1 3 . s e
Gitta Zahn - 28 Jun 2005 20:48 GMT
>>void update(){
>>    jclass cls = jEnv->GetObjectClass(jObj);
[quoted text clipped - 5 lines]
> use in this context. Use JNI_GetCreatedJavaVMs() and
> AttachCurrentThread(), part of the invocation API.

As alternative you could use the operation GetEnv()
within the operation update()
http://java.sun.com/j2se/1.4.2/docs/guide/jni/jni-12.html#GetEnv

This is at least necessary if you have multiple native threads
attached at the JVM.

Gitta


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.