By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,823 Members | 756 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,823 IT Pros & Developers. It's quick & easy.

c++ calling java calling c++ ...

P: n/a
Hi,

i'm currently working on a plugin for Adobe InDesign and i have some
problems with that. I'm not really a c++ guru, maybe somebody here has
an idea how to solve this.

The plugin is written in C++ and it's calling a java application. This
application displays a window and pushing a button is calling back the
c++-plugin again.

// The plugin class. CActionComponent is part of the InDesign SDK
class MyJNIComponent : public CActionComponent {
public:
...
static void onCreateDocument();
...
private:
...
void registerCallbacks();
...
}

// this is called from the java application
JNIEXPORT void JNICALL Java_createDocument(JNIEnv *e, jobject o);

// this is called from Java_createDocument()
void MyJNIComponent::onCreateDocument() {
...
// Here i'm using SDK-methods and functions to create and display a
document.
// And here is the problem - i get an assertion from the SDK.
// The code to create the document is ok, i used this code before
and i can
// call this method from inside the plugin without assertion
...
}

// Register Callback from the Java Application back to the Plugin
void MyJNIComponent::registerCallbacks() {
jint res;
JNINativeMethod nm;

// if this method is called in the java application ..
CJavaClassInstance layoutSystemToolBox("path/to/my/java/class");
nm.name="createDocument";
nm.signature="()V";

// .. call this function in the plugin
nm.fnPtr=Java_createDocument;

res=CJavaVM::env()->RegisterNatives(layoutSystemToolBox.getClassDefin ition(),&nm,1);
if (res!=0) {
CJavaVM::reportError("Can't find the Java_createDocument
method.");
return ;
}
}

// this function is called from java
JNIEXPORT void JNICALL Java_createDocument(JNIEnv *e, jobject o){
CJavaVM::env()->ExceptionClear();
// calling method in plugin class
MyJNIComponent::onCreateDocument();
}

I think the problem is, that Java_createDocument() is not part of the
MyJNIComponent class and when i'm calling
MyJNIComponent::onCreateDocument() from Java_createDocument() some
variables are not proper initialized.
And i don't know how to make Java_createDocument() part of the class.
Or if there is another way to solve this?

Thanks for any suggestions.
Aug 12 '05 #1
Share this Question
Share on Google+
7 Replies


P: n/a
I don't know but have you tried communicating via socket?

Ben
Aug 12 '05 #2

P: n/a
>I don't know but have you tried communicating via socket?
No. It's an idea but we have to change everything. At the moment the
java application works standalone and we're using some code and
dialogs for the plugin and for an extension for QuarkXPress.
Aug 12 '05 #3

P: n/a
comp.lang.c++

The name implies questions concerning the C++ language. Questions about
JNI and interaction with C++ should go to Java newsgroup because it
relates to JNI. Not C++.

-vijai.

Aug 13 '05 #4

P: n/a
* Klaus Friese <kfriese at dataplan punkt de>:
// And here is the problem - i get an assertion from the SDK.
// The code to create the document is ok, i used this code before
// and i can call this method from inside the plugin without
// assertion
...
}


So, the problem is in the code you haven't shown.

Anyway, the title is probably wrong: it seems your problem is "Java calling
C++ calling Java", or "Java calling C++ calling some Adobe API".

I do not think at all that the general area is off-topic, because such
integration is what C++ is often used for. Many questions in that area
would most be accepted in [clc++m]. However, it seems that what you have is
not a problem related to C++ usage in general, or the language, but rather
it seems to be a bug in your code, which would make the question -- with
relevant code included! -- more appropriate for e.g. [comp.programming].

But in general, if you can get rid of the Java part, do that: pure C++.

And in general, your problem description seems to be to vague to say more.

--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
Aug 13 '05 #5

P: n/a
On Sat, 13 Aug 2005 04:11:51 GMT, al***@start.no (Alf P. Steinbach)
wrote:
* Klaus Friese <kfriese at dataplan punkt de>:
// And here is the problem - i get an assertion from the SDK.
// The code to create the document is ok, i used this code before
// and i can call this method from inside the plugin without
// assertion
...
}
So, the problem is in the code you haven't shown.

Anyway, the title is probably wrong: it seems your problem is "Java calling
C++ calling Java", or "Java calling C++ calling some Adobe API". Java calling c++ is the standard way to use JNI, but i have the other
direction here.
We have an large application written in java and now we are writing
c++ code that uses parts of the java application. So people can use
the main application and they can use InDesign or XPress and they see
the same windows and dialogs.
I do not think at all that the general area is off-topic, because such
integration is what C++ is often used for. Many questions in that area
would most be accepted in [clc++m].

I can try it in clc++m tomorrow (i'm writing from my home account at
the moment). I also tried to find help in the Adobe User Forums, but
calling Java from the Plugin is not very commom.

---
Mail-Antworten bitte an klaus punkt friese at hamburg punkt de
Die andere Adresse ist nur ein Spam-Collector.
Aug 14 '05 #6

P: n/a
An easier route would be to use J-Integra for COM. It is a
bi-directional Java/COM interop bridge which allows C++ to talk to Java
and vice-versa. It supports callbacks, events, etc. It even has a high
performance native mode (i.e. JNI) built in. Have a look...

http://j-integra.intrinsyc.com/

Shane Sauer
J-Integra Interoperability Solutions
http://j-integra.intrinsyc.com/
When Web Services are not enough

Aug 15 '05 #7

P: n/a
On Sun, 14 Aug 2005 10:38:15 +0200, Klaus Friese <klaus punkte friese
at hamburg punkt de> wrote:
Java calling c++ is the standard way to use JNI, but i have the other
direction here.
No, JNI is both directions, see e.g.
http://java.sun.com/docs/books/jni/html/jniTOC.html
http://www.haertfelder.com/jni.html
http://www.jguru.com/faq/topicindex.jsp?topic=JNI
We have an large application written in java and now we are writing
c++ code that uses parts of the java application. So people can use
the main application and they can use InDesign or XPress and they see
the same windows and dialogs.


I've used JNI to call Java from C++ but I wouldn't do it again. The
JNI C++-to-Java interface is _very_ ugly and clumsy (but not the
Java-to-C++ interface, guess why). Moreover, a minimal Swing
application consumes at least 40 MB (up to 80MB or more) and you
cannot unload Java once it has been loaded with the shared library.
I'd rather communicate by socket (or COM?) with the Java application
or use a commercial product. You have been warned!!

Best wishes,
Roland Pibinger
Aug 15 '05 #8

This discussion thread is closed

Replies have been disabled for this discussion.