Guidelines for when to use JNI

I didn't find an answer to this in any FAQ or the 2 JNI books I have, so apologies in advance if this is a common question whose answer has already been posted -
Do any guidelines exist for when, and to what extent, JNI should be used?
I'm currently working on my second project where the question of whether or not to use it has come up. Both projects were distributed and contained both C++ and Java code in different areas. The issue came up when the need arose to implement a new shared library that had to be used by both C++ and Java code. Logging and configuration services are examples of the new functionality.
The choice is whether to implement the new libraries primarily in C++ and supply a Java interface, via JNI, for Java code which needs to use it, or to implement the new libraries in both C++ and Java to support both types of clients.
On the previous project, a team member had extensive JNI experience and recommended the dual language implementation approach instead of JNI. This worked out ok except we did have to have to ensure the new library developer was skilled in both C++ and Java, and he had to be sure to update both when changes to 1 were necessary - a maintenance problem. The experienced JNI developer made this recommendation due to issues he had encountered previously - most notably issues related to errors in the native code which brought down the JVM.
On the current project, we're opting for base C++ implementations with JNI wrappers. That's making me somewhat nervous since the alternative seems safer.
What do other developers think?

Have you checked out www.javaworld.com. They usually have very good and in-depth articles. IMHO, it all depends on the sort of use your library is intended for. If its used extensively by native code, use C++ with a Java wrapper. It its the other way around, implement it in Java and use a JNI interface for native code. I would really consider this carefully before implementing stuff in C++ that is used from Java. First of all, Java is after all much simpler than C++, its a more elgant OO-language and you have the platform neutrality. On the other hand, C++ has its sides. I dont use JNI unless its absolutely neccessary, in situations like using legacy code.
These are just a few of my thoughts, hope it gives you some hints.

Similar Messages

  • Guidelines for when to use SE vs. EE

    Are there any guidelines for when to use Standard Edition and when to use Enterprise Edition? Any limits on Standard edition as far as transactions/sec or number of users or size of database? Other than a list features that are not included in SE are there any other limitiations or reasons I should not go with SE over EE?

    Have you checked out www.javaworld.com. They usually have very good and in-depth articles. IMHO, it all depends on the sort of use your library is intended for. If its used extensively by native code, use C++ with a Java wrapper. It its the other way around, implement it in Java and use a JNI interface for native code. I would really consider this carefully before implementing stuff in C++ that is used from Java. First of all, Java is after all much simpler than C++, its a more elgant OO-language and you have the platform neutrality. On the other hand, C++ has its sides. I dont use JNI unless its absolutely neccessary, in situations like using legacy code.
    These are just a few of my thoughts, hope it gives you some hints.

  • Error when I use JNI

    Hi
    I�m developming a wrapper in C because I need to call C�methods of the scanner�drivers
    but when I run the java�code (the java�code call a JNI function that call the scanner drivers in C)
    I get the following error:
    C:\Documents and Settings\yamilet\Mis documentos\pruebaJNI\Scanner\escaner>java
    Scanner
    Valor devuelto por la funcion Open: 0
    # An unexpected error has been detected by HotSpot Virtual Machine:
    # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x02ca55ea, pid=2692, tid=4092
    # Java VM: Java HotSpot(TM) Client VM (1.5.0_02-b09 mixed mode, sharing)
    # Problematic frame:
    # C [LS100.dll+0x55ea]
    # An error report file with more information is saved as hs_err_pid2692.log
    # If you would like to submit a bug report, please visit:
    # http://java.sun.com/webapps/bugreport/crash.jsp
    Anybody have any idea about this error?
    Please help me
    Thank for advance

    The problem occurs the same way with or without breakpoints (MessageBoxes) in my code. Without any message boxes in the application, the values sent are retrieved, processed and the result sent back by the native method before the error shows up. I even do a println in the Java code of the result sent back before the error shows up.
    It appears that it is something about the creation of the COM component that is causing the JRE to fail. Interestingly, I have been running this appliction (same client code making use of COM components) for some time now using a C++ front end to pass the data with absolutely no problem. The only difference now is that I am using a Java front end and passing the data using JNI. As I wrote earlier, I have used the -Xcheck:jni option with no error reported. I have even use JRE 6 with the
    -XX:-RelaxAccessControlCheck option. That does not help.

  • Please provide real time scenario for when we use object type in PL/SQL.

    Hi Experts,
    When we use this kind of code in PL/SQL block.
    CREATE OR REPLACE TYPE sample_object IS OBJECT
    (id       NUMBER
    ,name     VARCHAR2(30));
    CREATE OR REPLACE TYPE sample_table IS TABLE OF sample_object;I have read some docs ,but I didn't get any information where exactly we use this.
    Please provide one real time scenario with an example.
    How this is different from record.
    Thanks in advance.

    Hi,
    For an example please have a look at this....
    CREATE OR REPLACE TYPE FML_DAT_ITEMS_OBJ AS OBJECT
                      (F_NAME VARCHAR2 (20), L_NAME VARCHAR2 (20));
    CREATE OR REPLACE TYPE FML_DAT_ITEMS_FTAB AS TABLE OF FML_DAT_ITEMS_OBJ;
    CREATE OR REPLACE FUNCTION GET_FML_ITEMS_DAT (PFML_NR IN NUMBER)
       RETURN FML_DAT_ITEMS_FTAB
       PIPELINED
    AS
       OUT_REC   FML_DAT_ITEMS_OBJ;
    BEGIN
       SELECT FML_DAT_ITEMS_OBJ ('peter', 'zwan') INTO OUT_REC FROM DUAL;
       FOR I IN 1 .. PFML_NR
       LOOP
          PIPE ROW (OUT_REC);
       END LOOP;
    END GET_FML_ITEMS_DAT;To view the o/p:
    SELECT * FROM TABLE (get_fml_items_dat (5));
    F_NAME, L_NAME
    peter,zwan
    peter,zwan
    peter,zwan
    peter,zwan
    peter,zwan Refer these links to know more about the topic...
    http://www.oracle-developer.net/display.php?id=207
    http://www.oracle-base.com/articles/misc/pipelined-table-functions.php

  • Why native code outside the VM when I use JNI in web application?

    I have a web application by using JBOSS as the server in windows XP environment. I need to call native functions in my servletAction class to check some information. After I start JBOSS and WebServer(tomcat), it works well when I launch the web page to call that native funtions in the first a few times, but after a while when I reopen that page in IE to call native funtions it throws me an unexpected error and shut down the jboss automatically. Could know how to solve it? Thank you guys in advance!
    Error message:
    An unexpected exception has been detected in native code outside the VM.
    Unexpected Signal : EXCEPTION_ACCESS_VIOLATION (0xc0000005) occurred at PC=0x63BA7AD
    Function=[Unknown.]
    Library=C:\WINDOWS\system32\HaspKeyDAO.dll
    NOTE: We are unable to locate the function name symbol for the error
    just occurred. Please refer to release documentation for possible
    reason and solutions.
    Current Java thread:
         at Key.readBlock(Native Method)     
         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
         at java.lang.reflect.Method.invoke(Method.java:324)
         at org.jboss.invocation.Invocation.performCall(Invocation.java:345)
         at org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.invoke(StatelessSessionContainer.java:214)
         at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:185)
         at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invoke(StatelessSessionInstanceInterceptor.java:113)
         at org.jboss.webservice.server.ServiceEndpointInterceptor.invoke(ServiceEndpointInterceptor.java:51)
         at org.jboss.ejb.plugins.CallValidationInterceptor.invoke(CallValidationInterceptor.java:48)
         at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:105)
         at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:283)
         at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:149)
         at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:128)
         at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:191)
         at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:122)
         at org.jboss.ejb.SessionContainer.internalInvoke(SessionContainer.java:624)
         at org.jboss.ejb.Container.invoke(Container.java:854)
         at sun.reflect.GeneratedMethodAccessor91.invoke(Unknown Source)
         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
         at java.lang.reflect.Method.invoke(Method.java:324)
         at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:141)
         at org.jboss.mx.server.Invocation.dispatch(Invocation.java:80)
         at org.jboss.mx.server.Invocation.invoke(Invocation.java:72)
         at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:242)
         at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:642)
         at org.jboss.invocation.jrmp.server.JRMPInvoker$MBeanServerAction.invoke(JRMPInvoker.java:775)
         at org.jboss.invocation.jrmp.server.JRMPInvoker.invoke(JRMPInvoker.java:382)
         at sun.reflect.GeneratedMethodAccessor90.invoke(Unknown Source)
         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
         at java.lang.reflect.Method.invoke(Method.java:324)
         at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:261)
         at sun.rmi.transport.Transport$1.run(Transport.java:148)
         at java.security.AccessController.doPrivileged(Native Method)
         at sun.rmi.transport.Transport.serviceCall(Transport.java:144)
         at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
         at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
         at java.lang.Thread.run(Thread.java:534)
    Dynamic libraries:
    0x00400000 - 0x0040B000      C:\j2sdk1.4.2_06\bin\java.exe
    0x7C900000 - 0x7C9B0000      C:\WINDOWS\system32\ntdll.dll
    0x7C800000 - 0x7C8F4000      C:\WINDOWS\system32\kernel32.dll
    0x77DD0000 - 0x77E6B000      C:\WINDOWS\system32\ADVAPI32.dll
    0x77E70000 - 0x77F01000      C:\WINDOWS\system32\RPCRT4.dll
    0x77C10000 - 0x77C68000      C:\WINDOWS\system32\MSVCRT.dll
    0x08000000 - 0x08139000      C:\j2sdk1.4.2_06\jre\bin\client\jvm.dll
    0x77D40000 - 0x77DD0000      C:\WINDOWS\system32\USER32.dll
    0x77F10000 - 0x77F56000      C:\WINDOWS\system32\GDI32.dll
    0x76B40000 - 0x76B6D000      C:\WINDOWS\system32\WINMM.dll
    0x10000000 - 0x10007000      C:\j2sdk1.4.2_06\jre\bin\hpi.dll
    0x00390000 - 0x0039E000      C:\j2sdk1.4.2_06\jre\bin\verify.dll
    0x003B0000 - 0x003C9000      C:\j2sdk1.4.2_06\jre\bin\java.dll
    0x003D0000 - 0x003DD000      C:\j2sdk1.4.2_06\jre\bin\zip.dll
    0x003E0000 - 0x003EF000      C:\j2sdk1.4.2_06\jre\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
    0x76FB0000 - 0x76FB8000      C:\WINDOWS\System32\winrnr.dll
    0x76F60000 - 0x76F8C000      C:\WINDOWS\system32\WLDAP32.dll
    0x03070000 - 0x030AC000      C:\Program Files\NewDotNet\newdotnet6_38.dll
    0x774E0000 - 0x7761D000      C:\WINDOWS\system32\ole32.dll
    0x77120000 - 0x771AC000      C:\WINDOWS\system32\OLEAUT32.dll
    0x77260000 - 0x772FE000      C:\WINDOWS\system32\urlmon.dll
    0x77F60000 - 0x77FD6000      C:\WINDOWS\system32\SHLWAPI.dll
    0x77C00000 - 0x77C08000      C:\WINDOWS\system32\VERSION.dll
    0x771B0000 - 0x77256000      C:\WINDOWS\system32\WININET.dll
    0x77A80000 - 0x77B14000      C:\WINDOWS\system32\CRYPT32.dll
    0x77B20000 - 0x77B32000      C:\WINDOWS\system32\MSASN1.dll
    0x77920000 - 0x77A13000      C:\WINDOWS\system32\SETUPAPI.dll
    0x71B20000 - 0x71B32000      C:\WINDOWS\system32\MPR.dll
    0x76C30000 - 0x76C5E000      C:\WINDOWS\system32\WINTRUST.dll
    0x76C90000 - 0x76CB8000      C:\WINDOWS\system32\IMAGEHLP.dll
    0x7C9C0000 - 0x7D1D4000      C:\WINDOWS\system32\SHELL32.dll
    0x773D0000 - 0x774D2000      C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2180_x-ww_a84f1ff9\comctl32.dll
    0x5D090000 - 0x5D127000      C:\WINDOWS\system32\comctl32.dll
    0x76FC0000 - 0x76FC6000      C:\WINDOWS\system32\rasadhlp.dll
    0x662B0000 - 0x66308000      C:\WINDOWS\system32\hnetcfg.dll
    0x71A90000 - 0x71A98000      C:\WINDOWS\System32\wshtcpip.dll
    0x042C0000 - 0x042C6000      C:\j2sdk1.4.2_06\jre\bin\ioser12.dll
    0x04410000 - 0x04418000      C:\j2sdk1.4.2_06\jre\bin\nio.dll
    0x046A0000 - 0x046A5000      C:\j2sdk1.4.2_06\jre\bin\rmi.dll
    0x047F0000 - 0x0490E000      C:\jboss-4.0.0-winsort\server\default\tmp\native\SharedLib\HaspKeyDAO.dll
    0x04A20000 - 0x04A73000      C:\jboss-4.0.0-winsort\server\default\tmp\native\msc\dll\haspms32.dll
    0x06390000 - 0x064AE000      C:\WINDOWS\system32\HaspKeyDAO.dll
    0x76F50000 - 0x76F58000      C:\WINDOWS\system32\wtsapi32.dll
    0x76360000 - 0x76370000      C:\WINDOWS\system32\WINSTA.dll
    0x5B860000 - 0x5B8B4000      C:\WINDOWS\system32\NETAPI32.dll
    0x59A60000 - 0x59B01000      C:\WINDOWS\system32\DBGHELP.dll
    0x76BF0000 - 0x76BFB000      C:\WINDOWS\system32\PSAPI.DLL
    Heap at VM Abort:
    Heap
    def new generation total 9216K, used 2204K [0x10010000, 0x10a00000, 0x12770000)
    eden space 8256K, 26% used [0x10010000, 0x102370e8, 0x10820000)
    from space 960K, 0% used [0x10820000, 0x10820000, 0x10910000)
    to space 960K, 0% used [0x10910000, 0x10910000, 0x10a00000)
    tenured generation total 121024K, used 39043K [0x12770000, 0x19da0000, 0x30010000)
    the space 121024K, 32% used [0x12770000, 0x14d90ec8, 0x14d91000, 0x19da0000)
    compacting perm gen total 23808K, used 23618K [0x30010000, 0x31750000, 0x34010000)
    the space 23808K, 99% used [0x30010000, 0x31720888, 0x31720a00, 0x31750000)
    Local Time = Thu May 26 11:34:39 2005
    Elapsed Time = 3209
    # The exception above was detected in native code outside the VM
    # Java VM: Java HotSpot(TM) Client VM (1.4.2_06-b03 mixed mode)
    Following is what I am doing:
    I have a key.java file with several native functions.
    In key.cpp I defined the implementation of above functions then created dynamic link library file key.dll. I put the key.dll to WEB-INF/lib/key.dll.
    Then in a servlet Action class, I called new key().keyPresent and new key().readBlock(0, 8, block, p1,p1).
    Public class Key{
    public native int keyPresent(int password1, int password2);
    public native void readBlock(int startMemoryLocation, int size,
    byte[] block, int password1, int password2);
    static {
    System.loadLibrary("Key");
    //A Singleton Class
    private static Key key;
    private Key()
    public static Key getSingletonObject()
    if ( key== null)
    key = new Key();          
    return key;
    public Object clone()
         throws CloneNotSupportedException
    throw new CloneNotSupportedException();
    Key.cpp:
    #include <jni.h>
    #include "Key.h"
    #include <stdio.h>
    #include "hasp.h"
    #include <memory.h>
    JNIEXPORT jint JNICALL Java_Key_keyPresent
    (JNIEnv *env, jobject obj, jint pass1, jint pass2)
         try{
              int keyPresent = 0;
              int p1, p2, p3, p4;
              int seed = 100;
              int port = 0;
              p1 = p2 = p3 = p4 = 0;
              hasp(LOCALHASP_ISHASP, seed, port, 0, 0, &p1, &p2, &p3, &p4);
              if (p1 == 0) {
                   printf("\nNo Hasp exists. Program aborted.\n");
                   return -1;
              if (p3 == HASPERR_VERSION_MISMATCH) {
              printf("Old driver found - please update driver to actual version.\n");
              return 2;
              hasp(LOCALHASP_HASPSTATUS, seed, port, pass1, pass2, &p1, &p2, &p3, &p4);
              if (p3 == 0) {
                   return 4;
              hasp(LOCALHASP_HASPGENERATION, seed, port, pass1, pass2, &p1, &p2, &p3, &p4);
              if (p3) {
                   printf("Failed: haspKey password is not correct!");
                   return 4;
              } else {
                   switch (p1) {
                   case 0:
                   keyPresent = 3;
                                  break;
                   case 1:
                        keyPresent =1;
                        break;
              return keyPresent;
         }catch(...){
              return -999;
    * READBLOCK
    * reads a block of data from the HASP memory
    JNIEXPORT void JNICALL Java_Key_readBlock
    (JNIEnv *env, jobject obj, jint startMemoryLocation, jint nSize, jbyteArray pBlock, jint pass1, jint pass2)
         try{
              int     p1, p2, p3, p4;
              p1 = (startMemoryLocation+1)/2;
              p2 = nSize >> 1;
              jbyte *javablob = env->GetByteArrayElements(pBlock, 0);
              memset(javablob, 0, nSize);
              p4 = (int)javablob;
              int seed = 100;
              int port = 102;
              hasp(MEMOHASP_READBLOCK, seed, port, pass1, pass2, &p1, &p2, &p3, &p4);
              env->ReleaseByteArrayElements(pBlock, javablob, 0);
              if (p3) {
                   printf("Failed. Error number: %d.\n", p3);
              } else {
         }catch(...){
              printf("readBlock function failed");
    }

    the error happens in your native-code which runs outside the VM of course, since its native.
    You access some memory where you don't have rights to do so, in a normal win32-app you would get the "application crashed at 0xdeadbeef"-window, and since java cannon guarantee that your code did not destroy something it shuts down.
    I would try to debug my code withought java in a C++ IDE/Debugger.
    good luck, lg Clemens

  • What to look for when buying used

    I'm planning on replacing my oooollddd G4 desktop, likely with a used MacBook if I get my way.
    I figure there are some things I know I can do to make sure it's in good, working condition. (And yeah, I realize there'll be some wear from having had an owner already) Checking for a noisy hard drive or dvd drive, the display and making sure ports work are obvious points but I was wondering if anyone can suggest anything I can do to be a little more thorough?
    I don't want to have to download software to run tests. I'm hoping there are things that are already part of OS X that can help. (eg. I'm looking through the utilities apps to see what might be good to run if anything)

    Rather than take the risk of buying another person's problems, consider purchasing an Apple refurbished unit. You get newer model, it comes with a complete standard warranty, you can purchase an extended AppleCare warranty, and they are less expensive than the new models. You will find them at Apple's Online Store.

  • FORALL and FOR when to use

    Hi,
    I am just confusing..what is the difference between FORALL and FOR.

    Why it works?
    declare
    var1 varchar2(500);
    type varray_type is table of varchar2(50);
    v_varray varray_type;
    begin
    v_varray := varray_type('smith', 'king', 'jones');
    for i in 1 .. 3 loop
    var1 := var1 || ',' || v_varray(i);
    end loop;
    dbms_output.put_line(var1);
    end;
    OUTPUT: ,smith,king,jones
    And why it is not..
    declare
    var1 varchar2(500);
    type varray_type is table of varchar2(50);
    v_varray varray_type;
    begin
    v_varray := varray_type('smith', 'king', 'jones');
    forall i in varray.first .. varray.last
    var1 := var1 || ',' || v_varray(i);
    end loop;
    dbms_output.put_line(var1);
    end;
    I am still confusing..can't we assign values to variable in FORALL?
    please suggest me.

  • Im trying to find the sound card i have for when I use bootcamp to use windows does anyone know where to find the sound card I have?

    Previously bootcamped my macbookpro but the sound doesn't work. I need to upgrade my sound card driver but can't do because I don't know the sound card I have. I need to find the sound card.

    well i have the new imac, the one without the cd drive so I hope they have it online or otherwise I dont know what to do.

  • When to use Managed Metadata service in Sharepoint 2013 and 2010

    Hi Folks,
    I have been working on sharepoint from quiet some time now. I have been using managed metadata service also.
    What I have not been able to find out so far is when should I be using MMS.
    What are the real advantages that I can draw out of it.
    I have one application that has Managed Metadata installed and has various terms stores and terms. 
    The Managed metadata service  created is utilized in search,
    What I do not know is what is why are we using it at all. 
    What is benefit of it.
    Managed metadata service could also be used in navigation is what i know.
    But what confused me is when is the best scenario to use it for navigation.
    Why can we not use the navigation provider in the managed metadata service. 
    There might be other uses also, but that is not clear to me.
    Can any one tell me why and in which scenario to really use it.
    I know how to configure the mms and how it works though the jargons around the managed metadata.
    Regards

    Managed Metadata has some specific advantages that make it useful for certain situations.
    A managed metadata column has the following advantages over a lookup or choice column:
    A managed metadata term set can be shared across the entire SharePoint farm, so you can use it in different site collections.
    You can set up "synonyms" so that multiple similar terms resolve to the same underlying piece of information
    Terms can be hierarchical (terms can be nested under other terms), and the SharePoint interface allows hierarchical filtering. For example, if I have a term set for Location, and one of my terms is North America, with terms below that for United States,
    Mexico, and Canada, I could choose to filter my list to show me all records with any North America location (inclusive of US, Mexico, and Canada), or to filter on a specific term (such as Mexico).
    You can allow people to enter new terms, which will then appear in the term set.
    You can specify information owners/stakeholders who maintain the term sets without them needing elevated access to sites; normally only site owners can mess with site columns and content types. Managed metadata lets you separate information management
    (what terms/synonyms should be used) from site management (granting access, creating groups and lists, etc).
    There are some disadvantages too. For example, with a lookup column, the lookup list can store additional columns of information. A managed metadata term set (on the other hand) only really stores terms (and descriptions/synonyms), but not related
    info. You might be tempted to do something like create a term set for part numbers, representing every part that your company produces; the term set would handle the part numbers just fine, but wouldn't let you add extra columns of information for
    description, weight, price, etc. In such a case, a lookup list is the better option.
    Microsoft has some suggested guidelines for when to use managed metadata/term store:
    SharePoint 2013:
    http://technet.microsoft.com/en-us/library/ee519604(v=office.15).aspx
    SharePoint 2010:
    http://technet.microsoft.com/en-us/library/ee519604(v=office.14).aspx
    A brief summary...
    Managed metadata is a good option when the potential metadata meets the following criteria:
    ​Is something for which a user will select a valid value​
    Represents information that is likely to be used multiple times
    ​Has valid values that can be organized hierarchically
    ​Includes synonyms or abbreviations that should be aggregated
    ​Can be applied in one language, but might be viewed in other languages
    Managed metadata is not a good option if the potential metadata meets any of the following criteria:
    Is represented by a built-in column (such as “last modified date”)
    ​Has an infinite number of valid values
    ​Has different valid values in each location that it is used (such as different values for the “version” attribute depending on which product team’s site the item appears in)*
    ​Has only “yes” and “no” as valid values
    *This type of metadata could still be captured in site collection-specific term stores

  • Masterdata - when to use it and when not to use it

    Hi!
    I have had some discussion with my colleagues about the use of masterdata on Oracle databases. Some of them tells me that I should use it if the data don't change often (ofcourse.....). This should ALWAYS be done they say. But I don't agree on this..
    Is it really necessary to make a lot of masterdata (and also views that has to be used) if the data is only to be loaded once a day, and the number of records is max 1000?
    I can't see the effect on this...
    Can someone give me a guideline for when to use masterdata, and when I don't need to use masterdata (if there are any article on this, please give it to me).
    Best Regards
    Helge

    Hi
    Answering this question usually requires a few books, so, I'm sorry, it's not really as simple as choosing between using a screwdriver vs. a hammer.
    But, very short, inheritance should ideally only be used when there exist a strict 'is-a' relationship. However, sometimes it may be clever to inherit when you have a 'is-almost-a' relationship... And sometimes this is a stupid move. This depends on the context/circumstances.
    Aggregation is normally considered a 'has-a' relationship, thereby differing clearly from inheritance. The old 'car' model says "a car is-a vehicle and has-some (at least) wheels."
    The wheels are aggregated to the car class, that itself is inherited from vehicle.
    However, this is just a good rule-of-thumb and there may be circumstantial reasons for not following these guidelines.

  • Trouble using JNI

    Hi everyone
    I have a problem, with a class which has native functions(JNI).
    The application I�m developing, uses thread�s. At the beginning before thread starts his job, application calls a native function without problem. But when another thread calls another native function(same class) generates the next error :
    java.lang.UnsatisfiedLinkError: estarEnEjecucion
    at MemoriaCompartida.estarEnEjecucion(Native Method)
    at MemoriaCompartida.estarEnEjecucion(MemoriaCompartida.java:72)
    at Censor.timerIntervalo(Censor.java:82)
    at Timer.run(Timer.java:225)
    at java.lang.Thread.run(Thread.java:534)
    What seems to be the problem???
    Thanks a lot for your help

    First of all,
    when I use JNI, I like to put the System.loadLibrary() on a static method in the first class I know will be loaded.
    like this:
    static {
        System.loadLibrary("Name");
    }So I know that Library was succesfuly loaded.
    Anyway, I bet that your library do NOT have the method you are trying to access, or maybe is missing parameters!
    Check it!
    If I didn't helped, please put the call of the methods in the java file and the library, if you can.
    Cya...
    Message was edited by:
    pbulgarelli
    Message was edited by:
    pbulgarelli

  • JVM Crash When Using JNI and COM

    I'm trying to call a DLL compiled from VB6 source code that I do not have access to. The VB6 code simply retrieves data from a DB2 database using ADO and my client code grabs that data and marshals it to my Java code. I'm attempting to achieve this using JNI and COM (without a third-party bridge). It works 75% of the time, but the other 25% of the time, the JVM crashes with the usual Hotspot crash log containing an access violation exception. However, I don't know what in my C++ code (VC++ 8) could be causing this except for passing a "wild" pointer to the code lying underneath the COM object interface. If that is the case, I don't know how I am doing that.
    The Java code that is calling my native method is running on Tomcat 5.5.25 and just to be safe, I am not allowing multiple threads to concurrently call the method in my JNI DLL (though I realize that this will kill performance). Once I can get past this problem, I'll do the COM interfacing on a worker thread in my native code so I don't screw up CoInitialize and CoUninitialize calls in the case the same thread is concurrently executing multiple calls to my native code.
    I've noticed that in most cases, the JVM crashes during my call to the pClsAccount->OpenConnection method. However, my DLL isn't what is listed on the top of the call stack, which is why I suspect the passing of a wild pointer, though I'm just taking a guess at that. Does anyone have an idea as to what's going on ?
    JNIEXPORT jobject JNICALL Java_CustomerInfo_nGetCustomerAccountInfo(JNIEnv *env, jobject customerInfo, jstring accountNumber, jstring iniFileName)
    jboolean isCopy;
    // Account info class and instance to be instantiated
    jclass accountInfoCls = NULL;
    jobject accountInfoObj = NULL;
    // The constructor ID of the accountInfoCls
    jmethodID ctorID = NULL;
    // Pointer to the interface for the ClsAccount COM object
    _clsAccount *pClsAccount = NULL;
    HRESULT hr;
    BSTR bstrIniFileName(L"");
    try
    const char *nativeAccountNumber = NULL;
    if (accountNumber != NULL)
    nativeAccountNumber = env->GetStringUTFChars(accountNumber, &isCopy);
    else
    jclass newExcCls;
    env->ExceptionDescribe();
    env->ExceptionClear();
    newExcCls = env->FindClass("java/lang/IllegalArgumentException");
    env->ThrowNew(newExcCls, "accountNumber passed in was null !");
    return NULL;
    // Initialization
    variantt varConnectionSucceeded = variantt(false);
    variantt varGetAccountInfoSucceeded = variantt(false);
    variantt varAccountNumber = variantt(nativeAccountNumber);
    bstrt bstrLastPaymentDate = bstrt();
    bstrt bstrLastErrorMessage = bstrt();
    bstrt bstrLastErrorNumber = bstrt();
    jlong jTotalDue = NULL;
    jlong jEstablishedDueDay = NULL;
    jlong jLastPaymentAmount = NULL;
    jstring jLastPaymentDate = NULL;
    jstring jLastErrorMessage = NULL;
    jstring jLastErrorNumber = NULL;
    jthrowable jException = NULL;
    const char *chLastPaymentDate = NULL;
    const char *chLastErrorMessage = NULL;
    const char *chLastErrorNumber = NULL;
    long long totalDue;
    long long lastPaymentAmount;
    long establishedDueDateDay;
    //Convert string from Java string to C string to VB string
    const char *nativeIniFileName = NULL;
    if (iniFileName != NULL)
    nativeIniFileName = env->GetStringUTFChars(iniFileName, &isCopy);
    else
    jclass newExcCls;
    env->ExceptionDescribe();
    env->ExceptionClear();
    newExcCls = env->FindClass("java/lang/IllegalArgumentException");
    env->ThrowNew(newExcCls, "iniFileName passed in was null");
    return NULL;
    bstrIniFileName = comutil::ConvertStringToBSTR(nativeIniFileName);
    CoInitialize(NULL);
    // Create an instance of the COClass with the interface over it
    hr = CoCreateInstance(__uuidof(clsAccount), NULL, CLSCTX_INPROC_SERVER, __uuidof(_clsAccount), (void **)&pClsAccount);
    if (hr == S_OK)
    varConnectionSucceeded.boolVal = pClsAccount->OpenConnection(&bstrIniFileName);
    &#12288;
    if (varConnectionSucceeded.boolVal == -1)
    varGetAccountInfoSucceeded.boolVal = pClsAccount->GetAccountPaymentInformation(&(varAccountNumber.GetVARIANT()));
    env->ReleaseStringUTFChars(accountNumber, nativeAccountNumber);
    // Extract all available account information from the ClsAccount object
    if (varGetAccountInfoSucceeded.boolVal == -1)
    totalDue = pClsAccount->TotalDue.int64;
    establishedDueDateDay = pClsAccount->EstablishedDueDateDay;
    lastPaymentAmount = pClsAccount->LastPaymentAmount.int64;
    bstrLastPaymentDate = pClsAccount->LastPaymentDate;
    chLastPaymentDate = comutil::ConvertBSTRToString(bstrLastPaymentDate.GetBSTR());
    jTotalDue = (jlong)totalDue;
    jEstablishedDueDay = (jlong)establishedDueDateDay;
    jLastPaymentAmount = (jlong)lastPaymentAmount;
    jLastPaymentDate = env->NewStringUTF(chLastPaymentDate);
    delete[] chLastPaymentDate;
    pClsAccount->CloseConnection();
    // Populate error fields if any errors occur
    bstrLastErrorMessage = pClsAccount->LastErrMessage;
    chLastErrorMessage = comutil::ConvertBSTRToString(bstrLastErrorMessage.GetBSTR());
    bstrLastErrorNumber = pClsAccount->LastErrNumber;
    chLastErrorNumber = comutil::ConvertBSTRToString(bstrLastErrorNumber.GetBSTR());
    jLastErrorMessage = env->NewStringUTF(chLastErrorMessage);
    jLastErrorNumber = env->NewStringUTF(chLastErrorNumber);
    delete[] chLastErrorMessage;
    delete[] chLastErrorNumber;
    const char* clsName = "com/nuance/merchantsmutual/businessentities/CustomerAccountInfo";
    // Find the Java class and the ID of its constructor
    accountInfoCls = env->FindClass(clsName);
    ctorID = env->GetMethodID(accountInfoCls, "<init>", "(JJJLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
    jException = env->ExceptionOccurred();
    if (jException != NULL)
    env->ExceptionDescribe();
    env->ExceptionClear();
    //Release all resources associated with the ClsAccount instance
    pClsAccount->Release();
    //Instantiate the class with the given parameters
    accountInfoObj = env->NewObject(accountInfoCls, ctorID, jTotalDue, jEstablishedDueDay, jLastPaymentAmount, jLastPaymentDate, jLastErrorMessage, jLastErrorNumber);
    jException = env->ExceptionOccurred();
    if (jException != NULL)
    env->ExceptionDescribe();
    env->ExceptionClear();
    else if (hr == REGDB_E_CLASSNOTREG)
    cout << "COM class not registered" << endl;
    else if ( hr == CLASS_E_NOAGGREGATION)
    cout << "COM class can't be aggregated" << endl;
    else if (hr == E_NOINTERFACE)
    cout << "No interface for COM class clsAccount" << endl;
    else if (hr == E_POINTER)
    cout << "*ppv pointer was NULL !" << endl;
    else
    cout << "Error occurred while creating COM object. HR is [" << hr << "]" << endl;
    // Free the BSTR because a new one was returned with a call to comutil::ConvertStringToBSTR
    SysFreeString(bstrIniFileName);
    // Release the string when it's no longer needed. MUST call if string won't be used
    // anymore or else a memory leak will occur
    env->ReleaseStringUTFChars(iniFileName, nativeIniFileName);
    CoUninitialize();
    &#12288;
    catch (_com_error &e)
    cout << "Encountered an exception in GetCustomerAccountInfo: Error was " << e.ErrorMessage();
    pClsAccount->Release();
    catch (...)
    pClsAccount->Release();
    return accountInfoObj;
    Edited by: Cthulhu76 on Jan 5, 2010 9:18 AM

    0x49202400 JavaThread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" daemon [_thread_blocked, id=5340, stack(0x49bf0000,0x49c40000)]
    0x48a7e800 JavaThread "Thread-1" [_thread_in_native, id=5976, stack(0x48f00000,0x48f50000)]
    0x48a0dc00 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=3072, stack(0x48c60000,0x48cb0000)]
    0x48a09000 JavaThread "CompilerThread0" daemon [_thread_blocked, id=4988, stack(0x48c10000,0x48c60000)]
    0x48a07c00 JavaThread "Attach Listener" daemon [_thread_blocked, id=3124, stack(0x48bc0000,0x48c10000)]
    0x48a07000 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=2572, stack(0x48b70000,0x48bc0000)]
    0x489f5c00 JavaThread "Finalizer" daemon [_thread_blocked, id=5752, stack(0x48b20000,0x48b70000)]
    0x489f4c00 JavaThread "Reference Handler" daemon [_thread_blocked, id=2596, stack(0x48ad0000,0x48b20000)]
    0x003c6000 JavaThread "main" [_thread_in_native, id=4252, stack(0x00820000,0x00870000)]
    Other Threads:
    0x489f0400 VMThread [stack: 0x48a80000,0x48ad0000] [id=5624]
    0x48a18800 WatcherThread [stack: 0x48cb0000,0x48d00000] [id=1192]
    VM state:not at safepoint (normal execution)
    VM Mutex/Monitor currently owned by a thread: None
    Heap
    def new generation total 36288K, used 12762K [0x02940000, 0x050a0000, 0x07800000)
    eden space 32256K, 34% used [0x02940000, 0x0343af58, 0x048c0000)
    from space 4032K, 37% used [0x04cb0000, 0x04e2ba28, 0x050a0000)
    to space 4032K, 0% used [0x048c0000, 0x048c0000, 0x04cb0000)
    tenured generation total 483968K, used 7518K [0x07800000, 0x250a0000, 0x42940000)
    the space 483968K, 1% used [0x07800000, 0x07f57958, 0x07f57a00, 0x250a0000)
    compacting perm gen total 14080K, used 14016K [0x42940000, 0x43700000, 0x46940000)
    the space 14080K, 99% used [0x42940000, 0x436f0320, 0x436f0400, 0x43700000)
    No shared spaces configured.
    Dynamic libraries:
    0x00400000 - 0x0040f000      C:\Program Files\Apache Software Foundation\Tomcat 5.5\bin\tomcat5.exe
    0x7c800000 - 0x7c8c0000      C:\WINDOWS\system32\ntdll.dll
    0x77e40000 - 0x77f42000      C:\WINDOWS\system32\kernel32.dll
    0x77380000 - 0x77411000      C:\WINDOWS\system32\USER32.dll
    0x77c00000 - 0x77c48000      C:\WINDOWS\system32\GDI32.dll
    0x77f50000 - 0x77feb000      C:\WINDOWS\system32\ADVAPI32.dll
    0x77c50000 - 0x77cef000      C:\WINDOWS\system32\RPCRT4.dll
    0x76f50000 - 0x76f63000      C:\WINDOWS\system32\Secur32.dll
    0x77ba0000 - 0x77bfa000      C:\WINDOWS\system32\MSVCRT.dll
    0x7c8d0000 - 0x7d0cf000      C:\WINDOWS\system32\SHELL32.dll
    0x77da0000 - 0x77df2000      C:\WINDOWS\system32\SHLWAPI.dll
    0x76290000 - 0x762ad000      C:\WINDOWS\system32\IMM32.DLL
    0x77420000 - 0x77523000      C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.3790.3959_x-ww_D8713E55\comctl32.dll
    0x6d7c0000 - 0x6da10000      C:\Program Files\Java\jre1.6.0_07\bin\client\jvm.dll
    0x76aa0000 - 0x76acd000      C:\WINDOWS\system32\WINMM.dll
    0x7c340000 - 0x7c396000      C:\WINDOWS\system32\MSVCR71.dll
    0x6d270000 - 0x6d278000      C:\Program Files\Java\jre1.6.0_07\bin\hpi.dll
    0x76b70000 - 0x76b7b000      C:\WINDOWS\system32\PSAPI.DLL
    0x6d770000 - 0x6d77c000      C:\Program Files\Java\jre1.6.0_07\bin\verify.dll
    0x6d310000 - 0x6d32f000      C:\Program Files\Java\jre1.6.0_07\bin\java.dll
    0x6d7b0000 - 0x6d7bf000      C:\Program Files\Java\jre1.6.0_07\bin\zip.dll
    0x6d570000 - 0x6d583000      C:\Program Files\Java\jre1.6.0_07\bin\net.dll
    0x71c00000 - 0x71c17000      C:\WINDOWS\system32\WS2_32.dll
    0x71bf0000 - 0x71bf8000      C:\WINDOWS\system32\WS2HELP.dll
    0x71b20000 - 0x71b61000      C:\WINDOWS\system32\mswsock.dll
    0x5f270000 - 0x5f2ca000      C:\WINDOWS\system32\hnetcfg.dll
    0x71ae0000 - 0x71ae8000      C:\WINDOWS\System32\wshtcpip.dll
    0x76ed0000 - 0x76efa000      C:\WINDOWS\system32\DNSAPI.dll
    0x76f70000 - 0x76f77000      C:\WINDOWS\System32\winrnr.dll
    0x76f10000 - 0x76f3e000      C:\WINDOWS\system32\WLDAP32.dll
    0x76f80000 - 0x76f85000      C:\WINDOWS\system32\rasadhlp.dll
    0x4a6a0000 - 0x4a6ac000      C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\MMI\WEB-INF\lib\CustomerInfoProxy.dll
    0x77670000 - 0x777a9000      C:\WINDOWS\system32\ole32.dll
    0x77d00000 - 0x77d8b000      C:\WINDOWS\system32\OLEAUT32.dll
    0x7c420000 - 0x7c4a7000      C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.4053_x-ww_E6967989\MSVCP80.dll
    0x78130000 - 0x781cb000      C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.4053_x-ww_E6967989\MSVCR80.dll
    0x777b0000 - 0x77833000      C:\WINDOWS\system32\CLBCatQ.DLL
    0x77010000 - 0x770d6000      C:\WINDOWS\system32\COMRes.dll
    0x77b90000 - 0x77b98000      C:\WINDOWS\system32\VERSION.dll
    0x75da0000 - 0x75e5d000      C:\WINDOWS\system32\SXS.DLL
    0x75e60000 - 0x75e87000      C:\WINDOWS\system32\apphelp.dll
    0x4dc30000 - 0x4dc5e000      C:\WINDOWS\system32\msctfime.ime
    0x4b0d0000 - 0x4b395000      C:\WINDOWS\system32\xpsp2res.dll
    0x71bb0000 - 0x71bb9000      C:\WINDOWS\system32\WSOCK32.dll
    0x4bbe0000 - 0x4bbea000      C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\MMI\WEB-INF\lib\ClearTranProxy.dll
    0x745e0000 - 0x7489e000      C:\WINDOWS\system32\msi.dll
    0x71c40000 - 0x71c97000      C:\WINDOWS\system32\NETAPI32.dll
    0x4bc50000 - 0x4bc6c000      C:\WINDOWS\system32\DBNETLIB.DLL
    0x71f60000 - 0x71f64000      C:\WINDOWS\system32\security.dll
    0x76c90000 - 0x76cb7000      C:\WINDOWS\system32\msv1_0.dll
    0x76cf0000 - 0x76d0a000      C:\WINDOWS\system32\iphlpapi.dll
    0x761b0000 - 0x76243000      C:\WINDOWS\system32\crypt32.dll
    0x76190000 - 0x761a2000      C:\WINDOWS\system32\MSASN1.dll
    0x4bcf0000 - 0x4bcff000      C:\Program Files\Common Files\System\Ole DB\SQLOLEDB.RLL
    0x4a8a0000 - 0x4a8aa000      C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\MMI\WEB-INF\lib\MIGI.DLL
    0x73570000 - 0x736c2000      C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\MMI\WEB-INF\lib\MSVBVM60.DLL
    0x4a950000 - 0x4a9e2000      C:\Program Files\Common Files\System\ado\msado15.dll
    0x74a50000 - 0x74a6a000      C:\WINDOWS\system32\MSDART.DLL
    0x4c850000 - 0x4c8c9000      C:\Program Files\Common Files\System\Ole DB\oledb32.dll
    0x4dbb0000 - 0x4dbc1000      C:\Program Files\Common Files\System\Ole DB\OLEDB32R.DLL
    VM Arguments:
    jvm_args: -Dcatalina.home=C:\Program Files\Apache Software Foundation\Tomcat 5.5 -Dcatalina.base=C:\Program Files\Apache Software Foundation\Tomcat 5.5 -Djava.endorsed.dirs=C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\endorsed -Djava.io.tmpdir=C:\Program Files\Apache Software Foundation\Tomcat 5.5\temp -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\logging.properties -Djava.library.path=C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\MMI\WEB-INF\lib vfprintf -Xms512m -Xmx1024m
    java_command: <unknown>
    Launcher Type: generic
    Environment Variables:
    JAVA_HOME=C:\Program Files\Java\jdk1.6.0_07
    [error occurred during error reporting (printing environment variables), id 0xc0000005]
    --------------- S Y S T E M ---------------
    OS: Windows Server 2003 family Build 3790 Service Pack 2
    CPU:total 4 (4 cores per cpu, 1 threads per core) family 6 model 7 stepping 6, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3
    Memory: 4k page, physical 2097151k(2097151k free), swap 4194303k(4194303k free)
    vm_info: Java HotSpot(TM) Client VM (10.0-b23) for windows-x86 JRE (1.6.0_07-b06), built on Jun 10 2008 01:14:11 by "java_re" with MS VC++ 7.1
    time: Mon Dec 28 15:24:00 2009
    elapsed time: 600 seconds

  • Developer Guidelines for Using /tmp ?

    Is there an Apple document anywhere with an official guidelines for using /tmp?
    I know Apple started (explicitly) encouraging developers to use /tmp under Leopard because it's ignored by Time Machine but I can't find any actual definition of what a "temporary" file is or how long it can be guaranteed to exist in /tmp. Does the system regularly flush /tmp files using something like cron or luanchd as a part of system maintain?
    I think it is a good idea but I don't want someone to leave the application open and possibly have a support file pulled out from underneath it.
    Thanks,
    =Tod

    Tod Kuykendall wrote:
    Is there an Apple document anywhere with an official guidelines for using /tmp?
    I don't think Apple's guidelines are any different than the standard /tmp guidelines for UNIX. That being said, I don't know if they are written down anywhere.
    I wouldn't use /tmp at all if there were another option. Most UNIX programmers try to avoid it because it is is usually a tiny partition on a local file system. Often, if you need a temp file, you need lots of space. Other times, you need a temp file but you want it to be fast. A common tactic is to create temp files and then hard link them into place when you are done. That usually won't work if using /tmp because the final destination is a different file system.
    I know Apple started (explicitly) encouraging developers to use /tmp under Leopard because it's ignored by Time Machine but I can't find any actual definition of what a "temporary" file is or how long it can be guaranteed to exist in /tmp. Does the system regularly flush /tmp files using something like cron or luanchd as a part of system maintain?
    They usually go away at reboot. I don't know if it is shutdown or start up. /tmp is a good place for UNIX sockets, but not much else.
    I think it is a good idea but I don't want someone to leave the application open and possibly have a support file pulled out from underneath it.
    Nothing is going to get pulled out from underneath. I don't know the details of when the flush takes place, but I know it won't touch any open files. Otherwise, some system services (UNIX sockets are on my mind these days) wouldn't work. I wouldn't close any file in /tmp and later expect it to be there. It usually will be there, but it isn't guaranteed.

  • AV when using JNI

    Hi,
    We have faced a problem that is very similar to the one reported in this thread:
    http://forums.bea.com/bea/message.jspa?messageID=200010160&tstart=0
    Has the problem been fixed in a later release?
    We are using BEA JRockit 5.0 R26.4.0-63 under Windows XP Professional 32-bit SP2 and still get Access Violations when using java.lang.Class.getDeclaredMethods() or java.lang.Class.getDeclaredFields(). The exception does not occur when we use the same module with Sun JVM and MS JVM.
    If the problem is supposed to be fixed, I can provide more details.
    Best regards,
    Alex
    ~~~~~~~~~~~~~~~~~~~~~

    Hello Staffan,
    Thanks for your reply. Here is a description of the first problem we have faced:
    When using JNI to call the java.lang.Class.getDeclaredMethods() or java.lang.Class.getDeclaredFields() method, we get the java.lang.NullPointerException exception in some cases. If we debug the java.exe process in Visual Studio 2005, we can see that the following exception occurs:
    First-chance exception at 0x7d612b73 in java.exe: 0xC0000005: Access violation reading location 0x00000010.
    Here is a part of the exception call stack:
    7d612b73()
    jvm.dll!_stubsCallC2JavaStub() + 0x24 bytes
    jvm.dll!_callC2Java() + 0x309 bytes
    jvm.dll!_jniCheckExceptionsForCall() + 0x12e bytes
    jvm.dll!_jniCallObjectMethodA@16() + 0x3b bytes
    jvm.dll!_jniGetVersion@4() + 0x993 bytes
    tcJavaHook.dll!JNIEnv_::CallObjectMethodA(_jobject * obj=0x34960204, _jmethodID * methodID=0x77b84b08, const jvalue * args=0x00000000)  Line 879 + 0x1f bytes C++
    We have done some investigations and found out that the problem occurs for the following classes:
    java.lang.Class, javax.swing.JPanel, javax.swing.JLayeredPane, javax.swing.JToolBar, javax.swing.AbstractButton, javax.swing.JLabel,
    javax.swing.JScrollPane, javax.swing.JViewport, javax.swing.JTable, javax.swing.CellRendererPane, javax.swing.JScrollBar, javax.swing.table.JTableHeader, javax.swing.JMenuBar, javax.swing.JComboBox, javax.swing.JSpinner, javax.swing.text.JTextComponent
    While the exception does not occur when calling methods of the following classes:
    javax.swing.JFrame, java.awt.Frame, javax.swing.JComponent, javax.swing.JRootPane, java.lang.Object, java.awt.Component, java.awt.Container, java.awt.Window, java.awt.Dialog, javax.swing.JDialog
    We were able to reproduce the problem with Eclipse 3.1.2 launched in the following way:
    I:\Java\jrockit-R26.4.0-jdk1.5.0_06\jre\bin\java.exe -Xms40m -Xmx256m -jar D:\Eclipse\startup.jar -os win32 -ws win32 -arch x86 -launcher D:\Eclipse\eclipse.exe -name Eclipse -showsplash 600 -exitdata 14a8_60 -vm I:\Java\jrockit-R26.4.0-jdk1.5.0_06\jre\bin\java.exe -vmargs -Xms40m -Xmx256m -jar D:\Eclipse\startup.jar
    I:\Java\jrockit-R26.4.0-jdk1.5.0_06\ - the installation folder of JRockit JDK
    D:\Eclipse\ - the root folder of Eclipse
    In this case, even trying to get information about the java.lang.Object class fields and methods causes the problem.
    Can you say anything based on the above call stack?
    Please let me know if you need any details about the problem.
    Best regards,
    Alex
    ~~~~~~~~~~~~~~~~~~~~~

  • I have problem when use 'JNI'

    Hello every body,
    I have an application language "C", which, I must make a wrapper java.
    To do this using "JNI".
    First I try to understand the functioning of JNI, I try it for the first example helloWorld.
    all steps works well, and dynamic library was well create: libHelloWorld.so
    The execution, it does'nt work
    When I try to java Helloworld, here's what I see:
    Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/java/jniexamples/HelloWorld/libHelloWorld.so: Can't load IA 32-bit .so on a IA 32-bit platform
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1676)
    at java.lang.Runtime.loadLibrary0(Runtime.java:822)
    at java.lang.System.loadLibrary(System.java:993)
    at HelloWorld.<clinit>(HelloWorld.java:7)
    Although I added the link to my library like this:
    export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: / home / Install / java / jniexamples / HelloWorld
    I dont understand where is the problem may be in the version I use of java, I use jdk-1.5.0-13?
    Thank you in advance for your help
    Regards
    Daniel

    Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/java/jniexamples/HelloWorld/libHelloWorld.so: Can't load IA 32-bit .so As a guess that would suggest that it found a file (thus the name is correct) but that the contents do not represent a shared library that the VM will load.
    That is usually because the compile/link options are wrong for the target VM.

Maybe you are looking for