Returning new objects on uninitialized native code arguments

I have a C library I am trying to interface to that returns arrays whose size
I do not know in advance. I would like to be able to write a java wrapper
library that accepts uninitialized java arrays as arguments, and creates
arrays of the appropriate size, and gives them back to the Java code.
In the code below, I try to pass an uninitialized String array to native
function, and create the String array in the native function. The String
array "str" is still null after the native function returns. I can make it
work by creating the String array in the java code, or making the return value
a String array created in the native code. Why doesn't it work when I pass an
uninitialized array as a parameter?
Java:
public native int getStrings(int length, String [] strings);...
String [] str= null;
int result = test.getStrings(10,str);C:
JNIEXPORT jint JNICALL Java_StringArrayTest_getStrings
(JNIEnv *env, jobject obj, jint length, jobjectArray strings)
    //create the java string array
   jclass elementType = (*env)->FindClass(env,"java/lang/String");
    if(NULL==elementType) return -1;
    strings=(*env)->NewObjectArray(env,length,elementType,NULL);
    if(NULL==strings)      return -1;
   jsize i;
    for(i=0; i<length; i++)
     char buf[100];
     snprintf(buf,99,"String %i",(int) i);
     jstring tempString=NULL;
     tempString=(*env)->NewStringUTF(env,buf);
     if(NULL==tempString) return -1;
     (*env)->SetObjectArrayElement(env, strings, i, tempString);
    return 0;
}

That kind of return-by-reference is not supported in Java. Consider: could it work if getStrings were written in Java language instead of native code? The answer is no.
-slj-

Similar Messages

  • How to Add New Object?

    HI,
    Any body can say how to add new object. For Example: The Document need to link with Invoice Transaction (T.Code: VF01, Table: VBRK/VBRP).
    Points will be rewarded, if information is useful.
    Tks
    Mani.

    Hi
    You can create New objects using the T.code: SE80.
    You can make an object link to SAP objects that are not shown in the possible entries list. To do this, proceed as follows:
    1. In the standard system, there are already two special screens for the module pools SAPLCV130 and SAPLCV140 for the linked SAP object.
    You must create two new screens with the same number for the module pools SAPLCV130 and SAPLCV140. The processing logic must follow that of screen 1204 in program SAPLVC130.
    2. Create function module OBJECT_CHECK_XXXX (XXXX = object name) If the object can be classified, this function module already exists .
    Otherwise copy the function module for linking equipment DOCUMENT_CHECK_EQUI and change it as required for the new object.
    Regards
    S.Sivakumar
    Reward points if useful----

  • [JNI Beginner] GC of Java arrays returned by the native code

    Hello all,
    I am beginning with JNI, to integrate a C library that pilots an industrial equipment, into a java UI. This library enables to exchange various proprietary PDUs (protocol data units), with the equipment, up and down (request/replies). Both requests and replies are arrays of bytes (+char*+).
    "Request" byte arrays are constructed by Java code, which passes them to the JNI code that glues with the lib. "Reply" byte arrays are returned to the Java code, which analyzes them.
    The "return reply" part is very similar to this [tutorial example|http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniexamp.html] , which returns bytes read from a file. However there's something I don't understand with regard to garbage collection of the returned byte array:
    - in this stock example, the C code creates a Java byte array fills it, and simply returns it (example code stripped to highlight only the parts relevant to my question):
        jByteArray=(*env)->NewByteArray(env, size);
        (*env)->SetByteArrayRegion(env, jByteArray, 0, size, (jbyte *)sourceBytes);
        return (jByteArray);What will happen to this Java array (jByteArray) with regard to garbage collection?
    - if it's no more referenced (the example Java code just systemouts it and forgets it), will it be eligible to GC?
    - if it is referenced by a Java variable (in my case, I plan to keep a reference to several replies as the business logic requires to analyze several of them together), do regular Java language GC rules apply, and prevent eligibility of the array to GC as long as it's referenced?
    That may sound obvious, but what mixes me up is that the same tutorial describes memory issues in subsequent chapters: spécifically, the section on "passing arrays states that:
    [in the example] the array is returned to the calling Java language method, which in turn, garbage collects the reference to the array when it is no longer usedThis seems to answer "yes" to both my questions above :o) But it goes on:
    The array can be explicitly freed with the following call:
    {code} (*env)-> ReleaseByteArrayElements(env, jByteArray, (jbyte *)sourceBytes, 0);{code}Under what circumstances would one need to explicitly free jByteArray when it's about to be returned to the Java calling method? Or does this sentence apply to completely different situations (such as, when the array is +not+ returned as is to a Java method)?
    The tutorial's next section has a much-expected +memory issues+ paragraph, from which I quote:
    By default, JNI uses local references when creating objects inside a native method. This means when the method returns, the references are eligible to be garbage collected.I assume this means, +unless the references are assigned, in the Java code, to a Java variable+, right?
    If you want an object to persist across native method calls, use a global reference instead. A global reference is created from a local reference by calling NewGlobalReference on the the local reference.I assume this enables the C code to maintain a global reference to a java object even if it's not referenced anymore from the Java variables, right?
    I also checked the [JNI specification|http://download-llnw.oracle.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp1242] , but this didn't clear the doubt completely:
    *Global and Local References*
    The JNI divides object references used by the native code into two categories: local and global references. Local references are valid for the duration of a native method call, and are automatically freed after the native method returns. Global references remain valid until they are explicitly freed.
    Objects are passed to native methods as local references. All Java objects returned by JNI functions are local references. The JNI allows the programmer to create global references from local references. JNI functions that expect Java objects accept both global and local references. A native method may return a local or global reference to the VM as its resultAgain I assume the intent is that Global references are meant for objects that have to survive across native calls, regardless of whether they are referenced by Java code. But what worries me is that combining both sentences end up in +All Java objects returned by JNI functions are local references (...) and are automatically freed after the native method returns.+.
    Could you clarify how to make sure that my Java byte arrays, be they allocated in C code, behave consistently with a Java array allocated in Java code (I'm familiar already with GC of "regular" Java objects)?
    Thanks in advance, and best regards,
    J.

    jduprez wrote:
    Hello all,
    I am beginning with JNI, to integrate a C library that pilots an industrial equipment, into a java UI. This library enables to exchange various proprietary PDUs (protocol data units), with the equipment, up and down (request/replies). Both requests and replies are arrays of bytes (+char*+).
    "Request" byte arrays are constructed by Java code, which passes them to the JNI code that glues with the lib. "Reply" byte arrays are returned to the Java code, which analyzes them.
    The "return reply" part is very similar to this [tutorial example|http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniexamp.html] , which returns bytes read from a file. However there's something I don't understand with regard to garbage collection of the returned byte array:
    - in this stock example, the C code creates a Java byte array fills it, and simply returns it (example code stripped to highlight only the parts relevant to my question):
        jByteArray=(*env)->NewByteArray(env, size);
    (*env)->SetByteArrayRegion(env, jByteArray, 0, size, (jbyte *)sourceBytes);
    return (jByteArray);What will happen to this Java array (jByteArray) with regard to garbage collection?It will be collected when it is no longer referenced.
    The fact that you created it in jni doesn't change that.
    The array can be explicitly freed with the following call:
    (*env)-> ReleaseByteArrayElements(env, jByteArray, (jbyte *)sourceBytes, 0);Under what circumstances would one need to explicitly free jByteArray when it's about to be returned to the Java calling method? Or does this sentence apply to completely different situations (such as, when the array is not returned as is to a Java method)?
    Per what the tutorial says it is either poorly worded or just wrong.
    An array which has been properly initialized it a just a java object. Thus it can be freed like any other object.
    Per your original question that does not concern you because you return it.
    In terms of why you need to explicitly free local references.
    [http://download-llnw.oracle.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp16785]
    The tutorial's next section has a much-expected memory issues paragraph, from which I quote:
    By default, JNI uses local references when creating objects inside a native method. This means when the method returns, the references are eligible to be garbage collected.I assume this means, unless the references are assigned, in the Java code, to a Java variable, right?As stated it is not precise.
    The created objects are tracked by the VM. When they are eligible to be collected they are.
    If you create a local reference and do NOTHING that creates an active reference elsewhere then when the executing thread returns to the VM then the local references are eligible to be collected.
    >
    If you want an object to persist across native method calls, use a global reference instead. A global reference is created from a local reference by calling NewGlobalReference on the the local reference.That is not precise. The scope is the executing thread. You can pass a local reference to another method without problem.
    I assume this enables the C code to maintain a global reference to a java object even if it's not referenced anymore from the Java variables, right?
    It enables access to it to be insured across multiple threads in terms of execution scope. Normally you should not use them.

  • How to access an object's variable from native code

    i am passing an object in a native method.i have to change the value of the object's variable.how do i access the variable of object and assign it new value from c++ code.when i try to access it i get a message that the variable must have a class/sruct/union type.
    pl. help.

    I'll tell You if You send me the structure of this object in Java. And a name of field what are You thinking about.
    Maciek

  • Not returning from the native code

    Hi,
    I am trying to access the native code using java applet. My java code seems to load the DLL(created using the VC++ 6.0) properly. Then when i call the native method called crypto, it does not seem to return from the nayive code . I am signing the applet and putting it a signed jar .Any suggestion is appreciated. I mite be wrong in the design too ...pleas ehelp. I am pasting the java code and the C code.
    cryptoJNI.java
    import java.awt.*;
    import java.io.*;
    import java.lang.*;
    import java.applet.*;
    public class cryptoJNI extends Applet {
         String uname=null;
         String b=null,ret=null;
         String a=null;
    public void init(){
              System.out.println("in init");
         public void dll_load(){
              b="before dll";
              System.loadLibrary("Msgimpl");
              a="after dll load";
         private native String crypto(String store);
    public void paint(Graphics g) {
              g.setColor(Color.blue);
              g.setColor(Color.magenta);
              load_dll();
              g.drawString(b, 5, 5);
              g.drawString(a, 15, 15);
              g.drawString("first call const", 25, 25);
              cryptoJNI app = new cryptoJNI();
              ret=app.crypto("My");
    g.drawString(ret, 75, 75);
              g.drawString("Signed 11", 120, 80);
              stop();
    CryptoJNI.c
    #define WIN32WINNT 0x0400
    #include <windows.h>
    #include <jni.h>
    #include <wincrypt.h>
    #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
    #include "cryptoJNI.h"
    BOOL APIENTRY DllMain(HANDLE hModule,
    DWORD dwReason, void** lpReserved) {
    return TRUE;
    JNIEXPORT void JNICALL
    Java_CryptoJNI_crypto(JNIEnv * jEnv,jobject obj,jstring jstore) {
    //     char               name[256];
         const char *msg;
         msg = (*jEnv)->GetStringUTFChars(jEnv, jstore,0);
         //printf("Before context\n");
         //(*jEnv)->ReleaseStringUTFChars(jEnv, jstore,msg);
         return (*jEnv)->NewStringUTF(jEnv, msg);
    In my applet, i have some debugging statements that helps me verify that the Msgimpl.dll loads properly. When i invoke the app.crypto() it just "hangs". Please help
    Thanks,
    Vivek

    Hi,
    This is the exception that i am getting?? my cryptoJNIImp.c is is in the same directory as the my java file,c:\vivek work\signedcode. and i have added this to my path env variable...If u see the output, it executes the init() and then loads the Msgimpl.dll. So its got nothing do with loading a DLL. Any pointers on this..
    in init
    before loading dll
    After loading dll
    java.lang.UnsatisfiedLinkError: crypto
    at cryptoJNI.crypto(Native Method)
    at cryptoJNI.paint(cryptoJNI.java:65)
    at sun.awt.RepaintArea.paint(Unknown Source)
    at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

  • Not sure on how to return a new object

    hi i am not sure on how to return a new Set object, i am not asking how to code this, i just don't exactly know what to write after "return.." to return a new object ...that part of the code is towards the bottom where i put arrows.....this is the skeleton of the code:
    public class Set
         // define fields here
         public Set(int maxinteger)
              // complete this method
         public boolean add(int integer)
              return false; // replace this line with your code
         public boolean remove(int integer)
              return false; // replace this line with your code
         public boolean contains(int integer)
              return false; // replace this line with your code
         public int size()
              return 0; // replace this line with your code
         public String toString()
              return null; // replace this line with your code
         public void addAll(Set other)
              // complete this method
    --------->     public Set subset(int min, int max)
              return null; // replace this line with your code
    ----------->     public Set intersection(Set other)
              return null; // replace this line with your code
    ------------->     public Set difference(Set other)
              return null; // replace this line with your code
         }

    well, when you use return is when trying to make a method have a value that have to be returned from it.
    In your case you have a Set CLASS, with methods, some methods have to return Strings, ints, Objects, etc.
    just make sure that you are returning the same type of value than the method say.
    the method parts are:
    modifier returnType name (parameters) {
    . code
    modifiers are public, private, etc.
    the return type specifies what the method will return, for example:
    public String toString () {
    must return a String value.
    to return a new Object just do it like a simple value, Strings are objects.
    just define a Set object and then return it.

  • Need the code to make these to new objects in BW world, please help...

    I have two fields that I get from the source (to DSO):
    CREATE_DATE (YYYYMMDD)
    REPORT_MONTH (YYYYMM)
    First I want to make a infoobjects (called CREATE_MONTH) that takes the YYYYMM from the CREATE_DATE.
    The I also want to make an indicator (called MONTH_IND) that have a test on infoobjects called CREATE_MONTH and REPORT_MONTH.
    The logic should be something like this:
    If CREATE_MONTH is 3 month earlier than REPORT_MONTH the indicator should say ‘over 2 month
    If CREATE_MONTH is 4 month earlier than REPORT_MONTH the indicator should say ‘over 3 month
    Etc….
    Conclution:
    Need two new objects:
    1. CREATE_MONTH
    2. MONTH_IND
    Can someone give me some help on how to do this Please?

    Hi Elaine!
    First of all I´d like to thank your answer.
    I know what you mean; I had a gif animated file in my web site and I converted it in a swf file, that is the reason why I couldn´t do the correct to make the link. I thought that I could make the link with a simple code but thanks to this foro, now I know that it is a bit more complicated.
    Anyway, I think that it is better if I read the tutorial to know how this work.
    Thank you again and have a nice day!
    afp5trip

  • RegisterObjet (for a new object) return a clone form a different object

    Hello,
    when I register a new object with registerObject method, I sometimes receive an object from the same class but a clone from an other objet.
    How is that possible ?
    thanks
    Annabelle

    Hello Annabelle,
    When you call registerObject(someObject), TopLink will perform an existence check to see if the object passed in is new or existing, then return a working copy of the object passed in. It the object was previously registered, it will pass the same working copy back, otherwise, it will clone the object passed in to use as the working copy.
    Are you using sequencing?
    If registerObject is passing back the same working copy for multiple new objects, there might be a problem with the object's primary key - which is used for identity.
    Try printing off what is in the identity maps using the session.getIdentityMapAccessor().initializeIdentityMaps() api on the UnitOfWork. This should show all the objects in the cache as well as the primary keys they are cached under, which might help to identify the problem object and how it got in the cache.
    Best Regards,
    Chris

  • How can i watch native code for hashCode() in Object class?

    How can i watch native code for hashCode() in Object class?

    Those are two different requirements. You still haven't told us why you want the first one.
    The second one is called JNI - Java Native Interface. There is a forum here, and a large amount of documentation, and a book about it.

  • How to return new blob object?

    Hi,
    I am trying to find documentation on how to return a custom abstract data type (ADT) using the CREATE TYPE... and BLOB interface.
    How can I return a new object type defined inside a blob. Can I return a blob (without initializing the lob locator first)?
    Please advise.

    Hi,
    Please check the below link.
    http://docs.oracle.com/cd/E24693_01/appdev.11203/e17126/create_type.htm
    Regards,
    Sailaja

  • Return new remote object

    Hi All!
    Help me!
    public interface Server extends Remote {
    QueryServer I() throws RemoteException;
    public class ServerImplementation extends UnicastRemoteObject implements Server {
    public QueryServer I() throws RemoteException {
    return new QueryServerImplementation();
    public ServerImplementation() throws RemoteException {
    super();
    public interface QueryServer extends Remote {
    String Y() throws RemoteException;
    public class QueryServerImplementation extends UnicastRemoteObject implements QueryServer {
    public String Y() throws RemoteException {
    return "Hello";
    public QueryServerImplementation() throws RemoteException {
    super();
    Server:
    public static void main(String args[]) {
    if (System.getSecurityManager() == null) {
    System.setSecurityManager(new RMISecurityManager());
    Registry registry = LocateRegistry.createRegistry();
    ServerImplementation serverImpl = new ServerImplementation();
    registry.bind("XXX", serverImpl);
    Client:
    public static void main(String args[]) {
    if (System.getSecurityManager() == null) {
    System.setSecurityManager(new RMISecurityManager());
    server = (Server) Naming.lookup("XXX");
    QueryServer qserver = server.I();
    String s = qserver.Y();
    Exception java.rmi.NoSuchObjectException
    What is uncorrect????
    Thank you!

    Works for me in JDK 1.3.1. What JDK are you using? and how much time if any elapses between the various client lookups and remote calls?
    In general RMI clients do have to be prepared to deal with NoSuchObjectExceptions. They simply mean that the stub is stale in the DGC sense and has to be reacquired. In your case the qserver stub must be reacquired by calling server.I(). If that throws NoSuchObjectException you must reacquire the server stub by repeating the lookup.

  • The crash happened outside the java virtual machine in native code

    Hi,
    I have a biometric device with which I am given some C++ dlls. I am trying to call methods inside these using java (jna). I am loading the dll "zkemsdk.dll+" as follows:
    zkemkeeper INSTANCE1 = (zkemkeeper)Native.loadLibrary("zkemsdk", zkemkeeper.class);//zkemsdk is the dll, I am loading the dll here.
    Then, I am calling the function:
    zkemkeeper.INSTANCE1.Z_Connect_NETEX("ip address",4370);//Z_Connect_NETEX is a function inside zkemsdk.dll
    This returns me true or false based on whether am connected to the biometric device or not.Thus I am able to invoke this method without issues. But for other methods inside the dll, run time exception is thrown in console:
    Can someone help me resolve this issue. ??? Following is the content of the log file generated.
    # A fatal error has been detected by the Java Runtime Environment:
    # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0351fe3b, pid=1664, tid=3832
    # JRE version: 6.0_20-b02
    # Java VM: Java HotSpot(TM) Client VM (16.3-b01 mixed mode, sharing windows-x86 )
    # Problematic frame:
    # C [zkemsdk.dll+0xfe3b]
    # If you would like to submit a bug report, please visit:
    # http://www.java.net/external?url=http://java.sun.com/webapps/bugreport/crash.jsp
    # The crash happened outside the Java Virtual Machine in native code.
    # See problematic frame for where to report the bug.
    --------------- T H R E A D ---------------
    Current thread (0x003a9000): JavaThread "main" [_thread_in_native, id=3832, stack(0x008c0000,0x00910000)]
    siginfo: ExceptionCode=0xc0000005, reading address 0x00000106
    Registers:
    EAX=0x0090f7c4, EBX=0x00000001, ECX=0x00000000, EDX=0x00000001
    ESP=0x0090f7b4, EBP=0x0090f848, ESI=0x00000096, EDI=0x003a9000
    EIP=0x0351fe3b, EFLAGS=0x00010216
    Top of Stack: (sp=0x0090f7b4)
    0x0090f7b4: 00000000 0090f930 000003fc 00000103
    0x0090f7c4: 0090f800 6d9532d0 373e92a0 00912ec5
    0x0090f7d4: 00000401 0090f7d8 369860d1 0090f800
    0x0090f7e4: 37390050 00000000 37390f90 00000000
    0x0090f7f4: 0090f800 0090f930 003a9000 0090f830
    0x0090f804: 10008fd8 0090f840 0090f930 00000008
    0x0090f814: 0090f88c 0090fa28 0090f8f4 0090f848
    0x0090f824: eb53f637 0351ffdc 00000096 00000003
    Instructions: (pc=0x0351fe3b)
    0x0351fe2b: 0f 53 50 8d 44 24 18 50 e8 58 7c 00 00 83 c4 0c
    0x0351fe3b: 8b 4e 70 51 8b 0e 83 c3 04 53 6a 64 8d 54 24 18
    Stack: [0x008c0000,0x00910000], sp=0x0090f7b4, free space=13d0090f2e8k
    Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
    C [zkemsdk.dll+0xfe3b]
    C [jna5972695927945545932.tmp+0x9182]
    C [jna5972695927945545932.tmp+0x2161]
    C [jna5972695927945545932.tmp+0x2849]
    j com.sun.jna.Function.invokeInt(I[Ljava/lang/Object;)I+0
    j com.sun.jna.Function.invoke([Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;+90
    j com.sun.jna.Function.invoke(Ljava/lang/Class;[Ljava/lang/Object;Ljava/util/Map;)Ljava/lang/Object;+194
    j com.sun.jna.Library$Handler.invoke(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;+344
    j $Proxy0.Z_Beep(J)Z+19
    j com.rfarrays.bhabs.fingerPrint.main([Ljava/lang/String;)V+84
    v ~StubRoutines::call_stub
    V [jvm.dll+0xf049c]
    V [jvm.dll+0x17fcf1]
    V [jvm.dll+0xf051d]
    V [jvm.dll+0xf9bc5]
    V [jvm.dll+0x10181d]
    C [javaw.exe+0x2155]
    C [javaw.exe+0x8614]
    C [kernel32.dll+0xb729]
    Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
    j com.sun.jna.Function.invokeInt(I[Ljava/lang/Object;)I+0
    j com.sun.jna.Function.invoke([Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;+90
    j com.sun.jna.Function.invoke(Ljava/lang/Class;[Ljava/lang/Object;Ljava/util/Map;)Ljava/lang/Object;+194
    j com.sun.jna.Library$Handler.invoke(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;+344
    j $Proxy0.Z_Beep(J)Z+19
    j com.rfarrays.bhabs.fingerPrint.main([Ljava/lang/String;)V+84
    v ~StubRoutines::call_stub
    --------------- P R O C E S S ---------------
    Java Threads: ( => current thread )
    0x02b10c00 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=1976, stack(0x02dc0000,0x02e10000)]
    0x02b0a400 JavaThread "CompilerThread0" daemon [_thread_blocked, id=1280, stack(0x02d70000,0x02dc0000)]
    0x02b08c00 JavaThread "Attach Listener" daemon [_thread_blocked, id=1984, stack(0x02d20000,0x02d70000)]
    0x02b07800 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=2160, stack(0x02cd0000,0x02d20000)]
    0x02b02400 JavaThread "Finalizer" daemon [_thread_blocked, id=2052, stack(0x02c80000,0x02cd0000)]
    0x02afd800 JavaThread "Reference Handler" daemon [_thread_blocked, id=752, stack(0x02c30000,0x02c80000)]
    =>0x003a9000 JavaThread "main" [_thread_in_native, id=3832, stack(0x008c0000,0x00910000)]
    Other Threads:
    0x02afc400 VMThread [stack: 0x02be0000,0x02c30000] [id=1504]
    0x02b1b800 WatcherThread [stack: 0x02e10000,0x02e60000] [id=1980]
    VM state:not at safepoint (normal execution)
    VM Mutex/Monitor currently owned by a thread: None
    Heap
    def new generation total 4928K, used 2455K [0x22970000, 0x22ec0000, 0x27ec0000)
    eden space 4416K, 55% used [0x22970000, 0x22bd5db0, 0x22dc0000)
    from space 512K, 0% used [0x22dc0000, 0x22dc0000, 0x22e40000)
    to space 512K, 0% used [0x22e40000, 0x22e40000, 0x22ec0000)
    tenured generation total 10944K, used 0K [0x27ec0000, 0x28970000, 0x32970000)
    the space 10944K, 0% used [0x27ec0000, 0x27ec0000, 0x27ec0200, 0x28970000)
    compacting perm gen total 12288K, used 343K [0x32970000, 0x33570000, 0x36970000)
    the space 12288K, 2% used [0x32970000, 0x329c5f20, 0x329c6000, 0x33570000)
    ro space 10240K, 51% used [0x36970000, 0x36e9ae00, 0x36e9ae00, 0x37370000)
    rw space 12288K, 54% used [0x37370000, 0x37a072d8, 0x37a07400, 0x37f70000)
    Dynamic libraries:
    0x00400000 - 0x00424000 C:\Program Files\Java\jre6\bin\javaw.exe
    0x7c900000 - 0x7c9b2000 C:\WINDOWS\system32\ntdll.dll
    0x7c800000 - 0x7c8f6000 C:\WINDOWS\system32\kernel32.dll
    0x77dd0000 - 0x77e6b000 C:\WINDOWS\system32\ADVAPI32.dll
    0x77e70000 - 0x77f03000 C:\WINDOWS\system32\RPCRT4.dll
    0x77fe0000 - 0x77ff1000 C:\WINDOWS\system32\Secur32.dll
    0x7e410000 - 0x7e4a1000 C:\WINDOWS\system32\USER32.dll
    0x77f10000 - 0x77f59000 C:\WINDOWS\system32\GDI32.dll
    0x76390000 - 0x763ad000 C:\WINDOWS\system32\IMM32.DLL
    0x7c340000 - 0x7c396000 C:\Program Files\Java\jre6\bin\msvcr71.dll
    0x6d800000 - 0x6da97000 C:\Program Files\Java\jre6\bin\client\jvm.dll
    0x76b40000 - 0x76b6d000 C:\WINDOWS\system32\WINMM.dll
    0x6d7b0000 - 0x6d7bc000 C:\Program Files\Java\jre6\bin\verify.dll
    0x6d330000 - 0x6d34f000 C:\Program Files\Java\jre6\bin\java.dll
    0x6d290000 - 0x6d298000 C:\Program Files\Java\jre6\bin\hpi.dll
    0x76bf0000 - 0x76bfb000 C:\WINDOWS\system32\PSAPI.DLL
    0x6d7f0000 - 0x6d7ff000 C:\Program Files\Java\jre6\bin\zip.dll
    0x68000000 - 0x68036000 C:\WINDOWS\system32\rsaenh.dll
    0x77c10000 - 0x77c68000 C:\WINDOWS\system32\msvcrt.dll
    0x769c0000 - 0x76a74000 C:\WINDOWS\system32\USERENV.dll
    0x5b860000 - 0x5b8b5000 C:\WINDOWS\system32\netapi32.dll
    0x6d610000 - 0x6d623000 C:\Program Files\Java\jre6\bin\net.dll
    0x71ab0000 - 0x71ac7000 C:\WINDOWS\system32\WS2_32.dll
    0x71aa0000 - 0x71aa8000 C:\WINDOWS\system32\WS2HELP.dll
    0x71a50000 - 0x71a8f000 C:\WINDOWS\System32\mswsock.dll
    0x76f20000 - 0x76f47000 C:\WINDOWS\system32\DNSAPI.dll
    0x76d60000 - 0x76d79000 C:\WINDOWS\system32\iphlpapi.dll
    0x76fb0000 - 0x76fb8000 C:\WINDOWS\System32\winrnr.dll
    0x76f60000 - 0x76f8c000 C:\WINDOWS\system32\WLDAP32.dll
    0x76fc0000 - 0x76fc6000 C:\WINDOWS\system32\rasadhlp.dll
    0x10000000 - 0x10052000 C:\Documents and Settings\bkonwar\Local Settings\Temp\jna5972695927945545932.tmp
    0x03510000 - 0x03546000 C:\WINDOWS\system32\zkemsdk.dll
    0x03560000 - 0x03574000 C:\WINDOWS\system32\commpro.dll
    0x662b0000 - 0x66308000 C:\WINDOWS\system32\hnetcfg.dll
    0x71a90000 - 0x71a98000 C:\WINDOWS\System32\wshtcpip.dll
    VM Arguments:
    jvm_args: -Dfile.encoding=Cp1252
    java_command: com.xyz.bhabs.fingerPrint
    Launcher Type: SUN_STANDARD
    Environment Variables:
    PATH=C:/Program Files/Java/jre6/bin/client;C:/Program Files/Java/jre6/bin;C:/Program Files/Java/jre6/lib/i386;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;;C:\Program Files\Java\jre1.6.0_07\bin;C:\Program Files\Android\android-sdk-windows\tools;C:\Program Files\TortoiseSVN\bin
    USERNAME=BKonwar
    OS=Windows_NT
    PROCESSOR_IDENTIFIER=x86 Family 6 Model 15 Stepping 13, GenuineIntel
    --------------- S Y S T E M ---------------
    OS: Windows XP Build 2600 Service Pack 3
    CPU:total 2 (2 cores per cpu, 1 threads per core) family 6 model 15 stepping 13, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3
    Memory: 4k page, physical 2085780k(1286036k free), swap 4024188k(3249652k free)
    vm_info: Java HotSpot(TM) Client VM (16.3-b01) for windows-x86 JRE (1.6.0_20-b02), built on Apr 12 2010 13:52:23 by "java_re" with MS VC++ 7.1 (VS2003)
    time: Wed May 25 10:02:24 2011
    elapsed time: 21 seconds
    Regards,
    Bhabs
    Edited by: 861222 on May 25, 2011 12:19 AM

    861222 wrote:
    # A fatal error has been detected by the Java Runtime Environment:
    # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0351fe3b, pid=1664, tid=3832Not much to tell here. This line here looks suspiciously like a null-pointer error happening in the native code. It is impossible to say how, where and why. Go back to your code and start debugging I'd say, see where invalid data can be passed to the native code.

  • Returning an Object Array

    I am unable to figure out the way in which I can return an object
    array from a cpp file to java. Is there any obvious error which you can spot in
    my CPP file?
    When I try to return a single object in the native function,
    it works fine but when I try to extend it and return an array of the object, it
    throws an error.
    Please find below the details
    h1. Java Class
    public class Flight {
    public String ID;
    public class InterfaceClass {
    private native Flight[] GetFlights();
    public static void main(String[] args)
    Flight[] objFlight = new
    InterfaceClass().GetFlights();
    System.+out+.println(objFlight[0].ID);
    static {
    System.+loadLibrary+("main");
    h1. CPP File
    JNIEXPORT jobjectArray JNICALL Java_InterfaceClass_GetFlights(JNIEnv env, jobject obj)
    //1. ACCESSING THE FLIGHT CLASS
    jclass cls_Flight = env->FindClass("LFlight;");
    //2. CONSTRUCTOR FOR FLIGHT CLASS
    jmethodID mid_Flight = env->GetMethodID(cls_Flight,"<init>", "()V");
    //3. CREATING AN OBJECT OF THE FLIGHT CLASS
    jobject objFlight = env->NewObject(cls_Flight, mid_Flight);
    //4. ACCESSING THE FLIGHT's "ID" FIELD
    jfieldID fid_ID = env->GetFieldID(cls_Flight, "ID","Ljava/lang/String;");
    //5. SETTING THE VALUE TO THE FLIGHT's "ID" FIELD
    env->SetObjectField(objFlight,fid_ID, env->NewStringUTF("ABC"));
    //6. ACCESSING THE FLIGHT ARRAY CLASS
    jclass cls_Flight_Array = env->FindClass("[LFlight;");
    if(cls_Flight_Array == NULL)
    printf("Error-1");
    //7. CREATING A NEW FLIGHT ARRAY OF SIZE 1 jobjectArray arrFlightArray = env->NewObjectArray(1,cls_Flight_Array,NULL);
    if(arrFlightArray == NULL)
    printf("Error-2");
    //8. INSERTING A FLIGHT BJECT TO THE ARRAY
    env->SetObjectArrayElement(arrFlightArray,0,objFlight);
    return arrFlightArray;
    h1. Error
    # A fatal error has been detected by the Java Runtime Environment:
    # EXCEPTION_ACCESS_VIOLATION
    (0xc0000005) at pc=0x6d9068d8, pid=1804, tid=3836
    # JRE version: 6.0_18-b07
    # Java VM: Java HotSpot(TM) Client VM (16.0-b13 mixed mode, sharing
    windows-x86
    # Problematic frame:
    # V [jvm.dll+0x1068d8]
    # An error report file with more information is saved as:
    # C:\Users\Amrish\Workspace\JNI Test\bin\hs_err_pid1804.log
    # If you would like to submit a bug report, please visit:
    http://java.sun.com/webapps/bugreport/crash.jsp
    C:\Users\Amrish\Workspace\JNI Test\bin>java -Djava.library.path=.
    InterfaceClass
    Exception in thread "main" java.lang.ArrayStoreException
    at
    InterfaceClass.GetFlights(Native Method)
    at
    InterfaceClass.main(InterfaceClass.java:6)
    C:\Users\Amrish\Workspace\JNI Test\bin>java -Djava.library.path=.
    InterfaceClass
    Exception in thread "main" java.lang.ArrayStoreException
    at
    InterfaceClass.GetFlights(Native Method)
    at
    InterfaceClass.main(InterfaceClass.java:6)
    Edited by: amrish_deep on Mar 18, 2010 7:40 PM
    Edited by: amrish_deep on Mar 18, 2010 7:40 PM

    //6. ACCESSING THE FLIGHT ARRAY CLASS
    jclass cls_Flight_Array = env->FindClass("[LFlight;");The argument to NewObjectArray is the +element+ class of the array you're about to create, not the +array+ class itself.

  • Setting native code from a class of a class passed in...

    I hope this makes sense, and its probably a stupid question but here it goes.
    I have a native function that takes in a java class. I can call the getters of this class from the native code to get values to fill out my c structure just fine, but conceptually I am not 100% how to call the getters of a class that is part of the other class I passed in. Basically i have something like this:
    the java call to the native being:
    public native void setJSource(JSource theSource);
    JNIEXPORT void JNICALL Java_AbfaRegion_setJSource
      (JNIEnv *env, jobject thisObj, jobject someVarsObj)
              jclass clazz;
              jmethodID mid;
              jint val;
              clazz = (*env)->GetObjectClass(env,someVarsObj);
              mid = (*env)->GetMethodID(env,clazz, "GetHeight", "I");
              val = (*env)->CallIntMethod(env,someVarsObj, mid);
              //put val into my struct
              mid = (*env)->GetMethodID(env,clazz, "GetWidth", "I");
              val=(*env)->CallIntMethod(env,someVarsObj, mid);
              //put val into my struct
    }I know how to do this...but what if I had a class say:
    class myClass
        JSource theSource; //has its own getters and setters like GetHeight
        int someVal;
        double anotherVal;
        public native void setMyClass(myClass theClass)
        int GetSomeVal()
          return this.someVal;
        int GetAnotherVal()
          return this.anotherVal;
        void SetSomeVal(int iSomeVal) 
          this.someVal=iSomeVal;
        void SetAnotherVal(double dAnotherVal)
          this.anotherVal=dAnotherVal;
    }and then suppose in the native setMyClass I would like to get the height of the jsource of myclass, how can i do that in native code, do I have to use findclass or something?
    Thanks for any help here, sorry if its a dumb question..
    -Shane

    For any class whose methods you are going to call, you need to first get a reference to the "class" record. So if you have an outer class, and have looked up its class record, and called a getter, and been returned an object (phew!):
    You need to now look up the class for the inner object; you can then look up the the methods and call them.
    JNI supports two ways to look up class:
    FindClass, where the key argument is the fully-qualified class name.
    GetObjectClass, where the key argument is an object reference.

  • How to return a object from a method in a java program to a C++ call (JNI )

    Sir,
    I am new to java and i have been assigned a task to be done using JNI.
    My question is,
    How can i return an object from a method in a java program to a call for the same method in a C++program using JNI.
    Any help or suggesstions in this regard would be very useful.
    Thanking you,
    Anjan Kumar

    Hello
    I would like to suggest that JNI should be your last choice and not your first choice. JNI is hard to get right. Since the JNI code is executing in the same address space as the JVM, any problems (on either side) will take down the entire process. It dilutes the Write Once Run Anywhere (WORA) value proposition because you need to provide the JNI component for all hardware/OS platforms. If you can keep your legacy code(or whatever you feel you need to do in JNI) in a separate address space and communicate via some inter-process channel, you end up with a system that is more flexible, portable, and scalable.
    Having said all that, head over to the Java Native Interface: Programmer's Guide and Specification web page:
    http://java.sun.com/docs/books/jni/
    Scroll down to the Download the example code in this book in ZIP or tar.gz formats. links and download the example source. Study and run the example sources. The jniexamples/chap5/MyNewString demo creates a java.lang.String object in native code and returns it to the Java Language program.

Maybe you are looking for

  • Application does not work on firefox 3.5

    If the application is not working in mozilla firefox 3.5 then we are not able to test it in any other browser through this tool. What should be the fix for this issue

  • Badi in crm 5.0

    I am working in crm 5.0 . When I am trying to create a badi it always needs an enhancement spot. I do not have much idea about enhancement spot. Please give me step by step method for creating badi in crm 5.0. I know how to create badi in crm 4

  • Urgent report compatability question

    Post Author: BruceLawrence CA Forum: General We have some reports that are out of wack.   The original .rpt file was created with CR v8. I've already tried to modify and save it with visual studio.net but the application that prints the report stated

  • Possible to tell input type in a FocusListener?

    I'm using a rather simple FocusListener to select the text in text boxes when they gain focus. public class SelectOnFocus extends FocusAdapter {      @Override      public void focusGained(FocusEvent ev) {           if (ev.getComponent() instanceof J

  • Downloaded FF 3.6.12 upgrade, launched FF, but it won't. Re-downloaded, re-launched, same result. on Mac OS 10.5.8

    I've used FF for years on a Mac, no prob. Recently downloaded the upgrade to 3.6.12 (as recommended by FF), but now I can't launch FF.