Instantiate Java objects from C++ and the ability for callbacks
I've been reading up on JNI and I've been able to
1) load a C++ DLL and call C++ functions from Java and
2) call Java functions from a C++ DLL.
However, I haven't been able to find a way to pass a C++ interface class to a Java method (from a C++ DLL), where the Java method will call functions in that interface. (That is; I need to initiate the C++ DLL before any Java code is called.) I'll illustrate below if I'm unclear.
// Java
public class javaClass
public void doStuff(WrapperInterface wi)
wi.foobar();
// C++
class WrapperInterface
virtual void foobar() = 0;
class cppClass : public WrapperInterface
virtual void foobar()
printf("helloworld");
int main()
// initiate JVM, environment etc
javaClass javaInstance;
WrapperInterface* cppInstance = new cppClass();
javaInstance.doStuff(cppInstance);
}How can I accomplish this?
I can't seem to instantiate a class in C++, that have been compiled as C++ with the javah command, so I can't instantiate it and set its initial values. (The functions are not declared as static in my Java class at least...) I can on the other hand instantiate it as a Java class. However, nothing happens when I call (from C++) the functions of the instantiated Java class.
Also, it seems according to my tests and the documentation that I could find that you are required to use a System.LoadLibrary() from Java. Will not that make the DLL it loads load again, thus creating two instantiations of that DLL?
As a final thought, if this is not possible with SUN's JNI, will it be possible to do with other native interfaces for Java?
You can pass a pointer back to java by using a java long data type. You can pass that to other java native (JNI) methods and write code that casts the long back to the C++ class and then calls a class method for that class.
Similar Messages
-
Cannot instantiate java object from c funtion
Hi guys,
I need some help on the following problem :
i want to call java method from c funtion using jni. My java method should instantiate another class on java side. Here's an example.
public class KMS {
public int problemMethod() {
System.out.println("We are in 1"); // This is written on the screen
Parser parser = new Parser();
System.out.println("We are in 2"); // This is not, but no problem on java side
return 1;
public class Parser {
// This class parse an XML document
}And Here's my c code :
void main(int argc, char *argv[])
// create JVM with success
jclass cls =(jclass) env->NewGlobalRef (env->FindClass ("KMS"));
if (cls == 0)
printf("cannot find cls \n");
jmethodID mid = (env)->GetMethodID(cls, "<init>", "()V");
if (mid == 0)
printf("cannot find initialization\n");
jobject jobj = (env)->NewObject(cls, mid);
if (jobj == 0)
printf("cannot find object\n");
jmethodID mymid = (env)->GetMethodID(cls, "problemMethod", "()I");
if(mymid == 0)
printf("cannot find problemMethod\n");
jint result = (env)->CallIntMethod(jobj, mymid);
printf("result %d\n", result);
}I get the following when I run c program :
We are in 1
I get no error msg, and the return value is 0. It seems that the JVM cannot instantiate class Parser. But the problem is when I run java code only, from a java main, it works fine. Do I need to implement another things in c side in order to be able to instanciate class Parser.
Thanks a lot for your help,
javaFriendly1. You have left out some important facts (like where
is your java code establishing the native method?
The native method and java codes can communicate. I can see the first System.out.println result when calling native method. My problem is for the second one. Class Parser cannot be instantiate. (But the java code is correct, I try it when I use only java).
2. Since your native code returns nothing, why would
you expect ANY particular value to be returned?
I was talking about return in java side. My java code should return me 1, but in native method a see a 0. This shows that there's an error when calling java.
3. I would not count on the printf statements. You
probably - sometime - should see some output, but if
you don't do a "flush" after ech one, then there is a
good chance it will not appear where you expect it.Can you tell me how to use "flush" in order to see all results,
Best regards
Java friendly -
How to reference multiple instances of the same Java object from PL/SQL?
Dear all,
I'm experimenting with calling Java from PL/SQL.
My simple attempts work, which is calling public static [java] methods through PL/SQL wrappers from SQL (and PL/SQL). (See my example code below).
However it is the limitation of the public static methods that puzzels me.
I would like to do the following:
- from PL/SQL (in essence it needs to become a forms app) create one or more objects in the java realm
- from PL/SQL alter properties of a java object
- from PL/SQL call methods on a java object
However I fail to see how I can create multiple instances of an object and reference one particular object in the java realm through public static methods.
My current solution is the singleton pattern: of said java object I have only 1 copy, so I do not need to know a reference to it.
I can just assume that there will only ever be 1 of said object.
But I should be able to make more then 1 instance of an object.
To make it more specific:
- suppose I have the object car in the java realm
- from PL/SQL I want to create a car in the java realm
- from PL/SQL I need to give it license plates
- I need to start the engine of a scpecific car
However if I want more then 1 car then I need to be able to refrence them. How is this done?
Somehow I need to be able to execute the following in PL/SQL:
DECLARE
vMyCar_Porsche CAR;
vMyCar_Fiat CAR;
BEGIN
vMyCar_Porsche = new CAR();
vMyCar_Fiat = new CAR();
vMyCar_Porsche.setLicensePlates('FAST');
vMyCar_Porsche.startEngine();
vMyCar_Fiat.killEngine();
END;
Thanks in advance.
Best Regards,
Ruben
My current example code is the following:
JAVA:
===
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED CODAROUL."RMG/BO/RMG_OBJECT" as package RMG.BO;
public class RMG_OBJECT {
private static RMG_OBJECT instance = new RMGOBJECT();
private String rmgObjectNaam;
private RMG_OBJECT(){
this.rmgObjectNaam = "NonDetermined";
public static String GET_RMGOBJECT_NAAM () {
String toestand = null;
if (_instance == null) {toestand = "DOES NOT EXIST";} else { toestand = "EXISTS";};
System.out.println("instance : " + toestand);
System.out.println("object name is : " + _instance.rmgObjectNaam);
return _instance.rmgObjectNaam;
public static Integer SET_RMGOBJECT_NAAM (String IN)
try
_instance.rmgObjectNaam = IN;
return 1;
catch (Exception e)//catch
System.out.println("Other Exception: " + e.toString());
e.printStackTrace();
return 5;
} //catch
PL/SQL Wrapper:
==========
CREATE OR REPLACE FUNCTION CODAROUL.SET_RMGOBJECT_NAAM(NAAM IN VARCHAR2) return NUMBER AS
LANGUAGE JAVA NAME 'RMG.BO.RMG_OBJECT.SET_RMGOBJECT_NAAM (java.lang.String) return java.lang.Integer';
Calling from SQL:
==========
CALL dbms_java.set_output(2000);
select CODAROUL.GET_RMGOBJECT_NAAM() from dual;
Edited by: RubenS_BE on Apr 6, 2012 5:35 AM
Edited by: 925945 on Apr 6, 2012 5:41 AMYou can do this by manually creating a new iterator binding in your binding tab.
So instead of dragging the VO directly to the page, go to the binding tab, add a new executable iterator binding, and point to that one from your ELs in the page itself. -
How can I drop the java objects from a schema
hi..good afternoon all...
How can I drop the java objects from a database schema???
suppose the credentials are scott/tiger@db1
Another thing is that...I have to do this from cmd(command prompt) as there is no plsql developer or sqldeveloper installed in the machine.
plss help...thanks in advance...hi...i have already tried all the options..but it is showing the error..
ora:01435 - user does not exist
but when i have given the command...
select object type, object_name, status from user_objects where object_type like'%JAVA%';
then it is showing that the java_object is present....
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>
SQL>
SQL>
SQL> set linesize 200
SQL>
SQL>
SQL>
SQL> select object_type, object_name, status from user_objects where object_type
like '%JAVA%';
OBJECT_TYPE OBJECT_NAME
STATUS
JAVA CLASS javaclass1
VALID
JAVA SOURCE javaclass1
VALID
SQL> drop java source javaclass1.java;
drop java source javaclass1.java
ERROR at line 1:
ORA-01435: user does not exist
SQL> -
There is a lot of talk about the Java security issues and the ability to download an apple patch fix, do i need to do this or will software update pick this up for me?
Thanks for that, how do I establish if I have Java installed as on Safari preferences it indicates the following
Web content - Enable Java
- Enable JavaScript -
Dropping java object from Oracle 8i
We areaable to load java methods and publish them to SQL in Oracle 8i using Jdev Deploy wizard, but we can not drop them thru
Open View As->Database Browser of the connection object, they drop menu is greyed out/disable. What kind privilege we need to drop java object from Oracle 8i? Or there is something wrong with the database setup.
Thank you very muchThere are three options:
Normal
SysDBA
SysOper
I have tried the three of them, none of them works, is there third option SYS?
Thank you very much.
<BLOCKQUOTE><font size="1" face="Verdana, Arial">quote:</font><HR>Originally posted by Amit:
Log in as SYS.<HR></BLOCKQUOTE>
null -
How can i return an object isn't java object from webservice????
Hi !
I have a problem in my Project. When i call method return a java object from webservice , it 's too easy. But when i create my own object (ex:ClientRequest.class) , it doesn't work exactly T_T . When i return that object (on client, doesn't have ClientRequest.class) , i cann't access its static variables.
How can i do it ??
Please help me !
Thanks a lot !!!!!
class ClientRequest {
public static int i;
public static String s;
public ClientRequest() {
}You can use REFCURSOR type for this. In java SQL TYPES this is available too. In your PLSQL use REFCURSOR for that array and then take the same from java code. Look in the servelet programming book for this SQLTYPE and see PLSQL for handling refcursors. We have done this way and it works.
-
Access Java object from Javascript
Hi
I'm trying to invoke a Java object from Javascript (scriptengine and all that).
I want to add scripting features to a GeneXus Java generated app... and I have very basic skills on java too. Sorry for that ;o).
This is the java code to pass "params" to the scriptengine:
engine.put("remoteHandle",remoteHandle);
engine.put("context", context); The remoteHandle (int) and context (com.genexus.ModelContext) pass trough all the gx-java generated programs.
This javascript works fine:
importClass(Packages.uftestjs);
new uftestjs(remoteHandle).execute( ) ;The remoteHandle conversion is ok (javascript-number to int). The context is optional.
But if I want to pass context:
importClass(Packages.uftestjs);
new uftestjs(remoteHandle, context).execute( ) ;Fails with this:
"javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: Java constructor for 'uftestjs' with arguments 'number,javax.script.SimpleScriptContext' not found."
Obviously, no conversion is possible with context (javax.script.SimpleScriptContext to com.genexus.ModelContext).
There is some way to reference de original context, by the object Id??? or something like that???
Thanks in advance for any replies!!!
Greetings from Chile. (I hope you can understand my english!)Hi
Well, since this topic is about java programming I think the place is right here.
(I use some tricks to embed java statements in genexus objects...)
I will try to get some help at Artech (GX) on how to build something... to get the conversion needed.
But they are not focussed on support this kind of questions.
Anyway, I want to know: do I can to reference an object by the objId?
I want to code something like this:
com.genexus.ModelContext context =
(com.genexus.ModelContex)getTheObjectFromTheJVM(theObjectId);(powered by google translator, ha!) -
2 TopLink Java Object from Table to be used in single selectOneChoice
Hello everyone, can I ask for help on how to solve my problem....
Here's my scenario, I have 2 tables namely tblCollege and tblCourse, they are related through tblCourse.CollegeCode = tblCollege.Code.
I use the jdeveloper wizard using TopLink -> Java Object from Table to add these table to my project. I created an EJB Data Control so that I can use them to my Userinterface using ADF Faces.
What I really want to do is that I need to have selectOneChoice component displaying:
tblCollege.Name + tblCourse.Name, and it should have a value of tblCollege.Code + tblCourse.Code,
so for example in my
tblCollege:
Code---------Name
1---------------Science
2---------------Music
tblCourse
Code-------Name-----------CollegeCode
1-------------Biology----------1
2-------------Computer-------1
3-------------Guitar------------2
what I want in my selectOneChoice is like this:
value----------display
1-1--------------Science-Biology
1-2--------------Science-Computer
2-3--------------Music-Guitar
I'm a little stuck on how I'm going to that. Thanks.Bawasi,
I see a couple of angles of attack, but this really depends on the technologies involved. If you are using ADF Bindings in combination with ADF Faces then you need to shape the data at the entity level. If ADF Bindings are no the in equation, you can take a less aggressive approach and shape the data in a managed bean. What is not clear to me is the end-to-end use-case. I see the read-only (i.e. how to get data to the drop box), but I am
not certain what attribute on an entity you are attempting to set. Are you trying to set the course for the current user or for a master schedule? Finally, notice that the final shape of your data set shows a unique combinations, you could increase the performance of your use-case and ease of development simply by denormalizing your schema.
--RiC -
32-bit JVM receiving Java objects from 64-bit JVM
Hi folks,
Question is: will there be problems for 32-bit JVM receiving Java objects from 64-bit JVM? and vice versa.
Our application client is running on 32-bit JVM, our server is running on 64-bit JVM. Client will send Java objects to server, and vice versa.
My past experience suggested when sending Java objects between client and server, both client and server needs to be compiled under the same JVM version. Any advice?
ChristyMy past experience suggested when sending Java
objects between client and server, both client and
server needs to be compiled under the same JVM
version. Any advice?This is only a case if you omit explicit serialVersionUID. My advice is to ALWAYS specify it for classes you want to serialize over the wire or put into persistent storage. It is way too tricky to rely on default one to fail half a year later when some new programmer adds one new public method to a class.
Unless you need to deserialize already existing resources, there is no need to put any magic number in serialVersionUID - just put 1 for every class you create and possibly increase it by 1 every time you want to make incompatible version (which is not happening so often, as in real world you often try to stay as compatible as possible) -
The sheet I am working on has lost the ability for me to scroll to the first few columns. I can't see the columns A & B but if I cut and paste the table to a new sheet, the columns I am missing will travel to the new sheet. I have charts and other stuff related the the original table so I need to figure out why I can only see from column C forward. I tried to "UNHIDE" the columns but the function doesn't seem to recognise that there are columns missing. Has this happened to others and how did you fix it?
I've seen it happen before, or at least it sounds something like what I've seen before. The table somehow gets into the margins of the page and the app doesn't know how to deal with it. Go into Print View and try moving the table away from the left side ofthe page. You might have to change content size or resize the table to get it to correct (then put you can put them back the way you like).
-
Bug: generate java objects generates error and does not terminate
During the build of java object generation...the following error occurs (below),
the generation progress dialog does not close,
and the process does not terminate.
Any suggestions?
Thank you.
Albert
va.lang.NullPointerException
at oracle.ideimpl.log.TabbedLogManager.getMsgPage(TabbedLogManager.java:101)
at oracle.toplink.addin.log.POJOGenerationLoggingAdapter.updateTask(POJOGenerationLoggingAdapter.java:42)
at oracle.toplink.addin.mappingcreation.MappingCreatorImpl.fireTaskUpdated(MappingCreatorImpl.java:1049)
at oracle.toplink.addin.mappingcreation.MappingCreatorImpl.generateMappedDescriptorsForTables(MappingCreatorImpl.java:231)
at oracle.toplink.addin.mappingcreation.MappingCreatorImpl.generateMappedDescriptorsForTables(MappingCreatorImpl.java:201)
at oracle.toplink.addin.wizard.jobgeneration.JobWizard$1.construct(JobWizard.java:401)
at oracle.ide.util.SwingWorker$1.run(SwingWorker.java:119)
at java.lang.Thread.run(Thread.java:595)
ADF configuration: Release 3 (10.1.3)
ADF Business Components 10.1.3.36.73
CVS Version Internal to Oracle JDeveloper 10g (client-only)
Java Platform 1.5.0_05
Oracle IDE 10.1.3.36.73
PMD JDeveloper Extension 1.8
Struts Modeler Version 10.1.3.36.73
UML Modelers Version 10.1.3.36.73
Versioning Support 10.1.3.36.73
Other Configuration:
Os Name Microsoft Windows Xp Home Edition
Version 5.1.2600 Service Pack 2 Build 2600
Os Manufacturer Microsoft Corporation
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
Schema:
Create Table Example.Questions
Qid Number Not Null,
Testid Number,
Question Varchar2(4000),
Answer Char(4) Default 'Zzzz' Not Null
Create Table Example.Testgenhistory
Testgenhistory_Testid Number Not Null,
Testid Number Not Null,
Requestor Varchar2(100),
Daterequested Date Default Systimestamp
Create Table Example.Testmaster
Testid Number Not Null,
Testname Varchar2(100),
Ownerrequestor Varchar2(100) Default '[email protected]' Not Null,
Testdatelastmodified Date
Create Table Example.Users
Requestor Varchar2(100) Not Null,
Adminauthority Number Default 0 Not Null
Alter Table Example.Questions
Add Constraint Questions_Pk Primary Key
Qid
Enable
Alter Table Example.Testgenhistory
Add Constraint Testgenhistory_Pk Primary Key
Testgenhistory_Testid
Enable
Alter Table Example.Testmaster
Add Constraint Testmaster_Pk Primary Key
Testid
Enable
Alter Table Example.Users
Add Constraint Users_Pk Primary Key
Requestor
Enable
Alter Table Example.Questions
Add Constraint Questions_Testmaster_Fk1 Foreign Key
Testid
References Myschema.Testmaster
Testid
) Enable
Alter Table Example.Testgenhistory
Add Constraint Testgenhistory_Users_Fk1 Foreign Key
Requestor
References Myschema.Users
Requestor
) Enable
Alter Table Example.Testgenhistory
Add Constraint Testgenhistory_Testmaster_Fk Foreign Key
Testid
References Myschema.Testmaster
Testid
) Enable
Create Index Example.Testmaster_Index1 On Example.Testmaster (Testid);
Create Sequence Example.Qidseq Increment By 1 Start With 1 Minvalue 1 ;
Create Sequence Example.Testidseq Increment By 1 Start With 1 Minvalue 1 ;Hi Anuj,
Sorry for the reply delay. I didn't get a notification of reply on the post.
I am still able to get the error message dialog, along with the failure for the generation to terminate. (reproduced today 4/22/06 and others seem to be seeing it as well).
I can't identify anything specific in the steps.
Basically...
created a new application with ejb, adf, toplink
choose new project
choose toplink generate java objects
choose an existing validated database connection
select objects (all 4 tables in my little schema)
click through (...next...next...) to finish
locks up and dialog appears
I made a video of the steps, including verifying the database connection. If you want to see it, I'll email it to you.
here it is today (I've applied all updates available up to today):
ava.lang.NullPointerException
at oracle.ideimpl.log.TabbedLogManager.getMsgPage(TabbedLogManager.java:101)
at oracle.toplink.addin.log .updateTask(POJOGenerationLoggingAdapter.java:42)
at oracle.toplink.addin.mappingcreation.MappingCreatorImpl.fireTaskUpdated(MappingCreatorImpl.java:1049)
at oracle.toplink.addin.mappingcreation.MappingCreatorImpl.generateMappedDescriptorsForTables(MappingCreatorImpl.java:231)
at oracle.toplink.addin.mappingcreation.MappingCreatorImpl.generateMappedDescriptorsForTables(MappingCreatorImpl.java:201)
at oracle.toplink.addin.wizard.jobgeneration.JobWizard$1.construct(JobWizard.java:401)
at oracle.ide.util.SwingWorker$1.run(SwingWorker.java:119)
at java.lang.Thread.run(Thread.java:595) -
i have bought a film from itunes and the credit has come out of my account, but i can't find the film anywhere, it said it was downloading, then i left the laptop and on return i couldn't find the film. how do i find the film?
Maybe it is in the Purchased category of iTunes,
Try going there -
Link between Delivery schedule line counter from PO and the material docume
Dear Gurus,
I have one PO with single line item having delivery schedule -
Material 1 -
delivery schedule 01.01.2009 2000
01.03.2009 5000
I have received quantity against this Po
I want to know where I can find the link between Delivery schedule line counter from PO and the material document
Best regards
SarThere is no link from the MAterial document line item (Table Mseg) to the PO Schedule Line (EKET).
If this is for Evaluating an on time delivery or GR, you may consider the following approach.
PO details Po Date QTY
Sch1 01Jun2009 200
SCH2 08Jun2009 100
GR Details
GR1 01Jun2009 180
GR2 07Jun2009 110
GR3 09Jun2009 10
Calculate a *** total qty for the PO Line.
PO details Po Date CUMUL QTY
Sch1 01Jun2009 200
SCH2 08Jun2009 300
Calculate a *** total qty for the ontime GR.
PO details Po Date CUMUL PO QTY CUMUL GR on time
Sch1 01Jun2009 200 180
SCH2 08Jun2009 300 290 (180+110) the 3rd GR was too late
Evaluate the PO SChedule Lines as follows:
Po SCL qty + CUMUL GR QTY - CUMUL PO QTY = ADJ GR ON Time Qty
SCH1 01Jun2009
200 + 180 - 200 = 180 on time for 01Jun2009 date ( 90% fill rate)
SCH2 08Jun2009
100 + 290 - 300 = 90 on time for 08Jun2009 date (90 % fill rate) the first 20 of the GR on 07Jun2009 went to fill the late, early date.
Best of luck !
SCH2 100 +290 - 300 = 90 on time for 07Jun2009 date -
i have two apple id one for Store purchases and the other for iCloud, and i want to merge them into one, can i transfer all app from one to other ?
It is not possible to merge Apple IDs.
Maybe you are looking for
-
Trap error within loop and process next record
Hi, I am processing each record inside a loop. Now if any exception occurs processing with a single record within loop I want to continue with the next record with proper error message in the log. How to achieve the above scenario? Shall I create a s
-
On the new mac mini with Thunderbolt, problems with monitors like macbook. Thunderbolt - Minidisplay to VGA - screen not activate, diferent screens. HDMI > DVI - Eizo screen S2202W, switch from vga to dvi, screen 3 sec snow before right image. VGA an
-
Status processing within Batch job.
Hello SAP-Guru's, I have question, we have to set the field MSTAE status in Mara. We have a written a programm and when we excute this programm online...it works. But the same programm when we run in batch programm (SM37) we are not able to process t
-
Voices and Random Icon Selection
Longtime listener, Fisrt time caller, I dunno what happened. It was like the computers speech option was turned on, but i was able to check system prefs and it was off. A black box would appear around cetain icons window buttons. for example: In syst
-
The Photos app on my iPhone 5s is showing an album called Bursts. It includes 1 burst of 3 photos. When I tap it, I only see 1 photo. How can I see the other two?