JNI and loadlibrary
I know there are about a billion topics already posted on this subject but I am getting nowhere with this issue.
I was able to get java to see the path and the shared library file that I want to load using
java -Djava.library.path=. myjavaclass.
However, I am getting a new runtime error now that looks like this:
java.lang.UnsatisfiedLinkError: <my ld lib path/my .so file> ld.so.1: /java/bin../bin/sparc/native_threads/java: fatal: relocation error: file <my ld lib path/my .so file> symbol <native c function called in my wrapper>: referenced symbol not found
This appears when the .so file is being loaded. Is there something I am missing?
It seems I was not creating the .so file correctly. It is working now, though. <yay>
Similar Messages
-
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);
 
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();
 
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 AM0x49202400 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 -
Java 1.5 JNI and C++ exception
Hello, All
I've troubles with handling C++ exceptions using JNI and shared library. I'm using Java 1.5_06, RedHat 7.3 and JBoss 4.0.5
From Java class I call JNI a method in my shared library(libx.so) which calls a method in other shared library(liby.so). Liby.so uses Xerces library. During parsing process an exception occurs. But according to Xerces sources it's a normal behavior and should be caught. But instead I've got SIGNABRT in JVM and a core dump will created. What's wrong? Backtrace shows similar something:
XXXXX __default_terminate() ....
XXXXX __terminate() ....
XXXXX __throws
XXXXX C++ method ..
XXXXX.....
XXXXX.....
XXXXX JNI methodI found similar bugs reports in the forum. But they says about Java 1.4 version and according to bugs descriptions it should be already fixed.
Message was edited by:
kostik78The question is closed. The root cause was incorrect building of shared library.
-
Hi,
At my job, we seem to have a memory leak related to JNI. We know we
have a memory leak because we keep getting Out of Memory errors even
after increasing the maximum heap size to more than 256 megs. And we
know that this is the application that is eating up all the system
memory.
We are running under Windows 2000, with both JDK 1.3.0 and JDK 1.4.1.
We tried looking at the problem under JProbe, but it shows a stable
Java heap (no problems, except that the Windows task manager shows it
growing and growing...)
I tried a strip down version, where I set the max heap size to 1 Meg,
and print out the total memory, memory used, and maximum memory used at
a 5 sec interval.
Memory used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory().
Well, I let that strip down version running for about a day. The
maximum memory used has stabilized to about 1.1 Meg, and has not
increased. The current memory used increases until it gets to some
threshold, then it decreases again. However, the Windows task manager
shows the memory increasing -- and currently it is at 245 Megs!
In the lab, the behavior we see with the Windows task manager is as
follows:
1. Total memory used in the system increases until some threshold.
2. Then it goes back down by about 100 Megs.
3. This cycle continues, but at each cycle the memory goes back down
less and less, until the app crashes.
Now, our theory is that JNI is consuming all this memory (maybe we are
using JNI wrong). That's the only explanation we can come up with to
explain what we have seen (Java showing an OK heap, but the task
manager showing it growing, until crashing).
Does that make sense? Can the new operator throw an Out of Memory
error if the system does not have enough memory to give it, even if
there is still free heap space as far as the Runtime object is
concerned? Does the Runtime object figures objects allocated through
JNI methods into the heap used space?
Note that I know the task manager is not a reliable indicator.
However, I don't think a Java app is supposed to runaway with system
memory -- the problem is not simply that the Java app is consuming too
much memory, but that it seems to always want more memory. Besides, we
do get the Out of Memory error.
Thanks for your help,
Nicolas RiveraHi,
there are two sources of memory leakage in JNI:
- regular leaks in c/c++ code;
- not released local/global references of java objects in JNI.
I think that the first issue in not a problem for you. The second is more complex. In your JNI code you should check
- how many local references alive you keep in your code as their number is restricted (about 16 and can be enlarged). The good style is not to store local references but keep only global.
- any local reference accepted from java call in JNI are released by JVM. You should release local references you created in JNI and also global references.
- do not use a large number of java object references. Each new reference gets new memory in JVM. Try to reuse refences.
I guess that is your problem.
Vitally -
Problem with JNI and Tomcat in windows
Hello guys...
I have the following problem.
I used Tomcat 4 and I have following ApiEncriptacion class, in package com.servipag.sts;
package com.servipag.sts;
class ApiEncriptacion
public native String encripta(String texto, String ubicacionLlavePublica, String semilla);
static
System.loadLibrary("apisdark");
public native String desencripta(String texto, String ubicacionLlavePrivada);
static
System.loadLibrary("apisdark");
the LD_LIBRARY_PATH is set in following dir c:\tomcat\bice
the dll this in the following path = c:\tomcat\bice\apisdark.dll
I run Tomcat at the following way..
C:\jdk1.4\bin\java.exe -jar -Djava.library.path="c:\tomcat\bice" -Duser.dir="C:\Tomcat" "C:\Tomcat\bin\bootstrap.jar" start
but, still appear the error:
java.lang.UnsatisfiedLinkError: encripta
at com.servipag.sts.ApiEncriptacion.encripta(Native Method)
at com.servipag.sts.ServiciosServiPagImpl.rescatarFirma(ServiciosServiPagImpl.java:2143)
at com.servipag.sts.ServiciosServiPagImpl.pagarCuenta(ServiciosServiPagImpl.java:310)
at org.apache.jsp.SBCO_0005flogin_0005fbice_0005f4$jsp._jspService(SBCO_0005flogin_0005fbice_0005f4$jsp.java:265)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:201)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:381)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:473)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2343)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:468)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1012)
at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1107)
at java.lang.Thread.run(Thread.java:536)
please help me
Luis Navarro.
ChileApiEncripatcion.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class ApiEncriptacion */
#ifndef IncludedApiEncriptacion
#define IncludedApiEncriptacion
#ifdef __cplusplus
extern "C" {
#endif
* Class: ApiEncriptacion
* Method: encripta
* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
JNIEXPORT jstring JNICALL Java_ApiEncriptacion_encripta
(JNIEnv *, jobject, jstring, jstring, jstring);
* Class: ApiEncriptacion
* Method: desencripta
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
JNIEXPORT jstring JNICALL Java_ApiEncriptacion_desencripta
(JNIEnv *, jobject, jstring, jstring);
#ifdef __cplusplus
#endif
#endif
ApiEncriptacion.c
#include "jni.h"
#include <stdio.h>
#include "files.h"
#include "hex.h"
#include "rsa.h"
#include "randpool.h"
USING_NAMESPACE(CryptoPP)
USING_NAMESPACE(std)
void GenerateRSAKey(unsigned int keyLength, const char privFilename, const char pubFilename, const char *seed);
char RSAEncryptString(const char pubFilename, const char seed, const char message);
char RSADecryptString(const char privFilename, const char *ciphertext);
JNIEXPORT jstring JNICALL
Java_ApiEncriptacion_encripta(JNIEnv *env, jobject obj, jstring texto, jstring ubicacionLlavePublica, jstring semilla)
try
char *ciphertext = RSAEncryptString(ubicacionLlavePublica, semilla, texto);
delete [] ciphertext;
return(ciphertext);
catch(CryptoPP::Exception &e)
return ("");
catch(std::exception &e)
return ("");
catch(...)
return ("");
JNIEXPORT jstring JNICALL
Java_ApiEncriptacion_desencripta(JNIEnv *env, jobject obj, jstring texto, jstring ubicacionLlavePrivada)
try
char *decrypted = RSADecryptString(ubicacionLlavePrivada, texto);
return(decrypted);
catch(CryptoPP::Exception &e)
return ("");
catch(std::exception &e)
return ("");
catch(...)
return ("");
int main()
return(0);
void GenerateRSAKey(unsigned int keyLength, const char privFilename, const char pubFilename, const char *seed)
RandomPool randPool;
randPool.Put((byte *)seed, strlen(seed));
RSAES_OAEP_SHA_Decryptor priv(randPool, keyLength);
HexEncoder privFile(new FileSink(privFilename));
priv.DEREncode(privFile);
privFile.MessageEnd();
RSAES_OAEP_SHA_Encryptor pub(priv);
HexEncoder pubFile(new FileSink(pubFilename));
pub.DEREncode(pubFile);
pubFile.MessageEnd();
char RSAEncryptString(const char pubFilename, const char seed, const char message)
FileSource pubFile(pubFilename, true, new HexDecoder);
RSAES_OAEP_SHA_Encryptor pub(pubFile);
if (strlen(message) > pub.MaxPlainTextLength())
cerr << "message too long for this key\n";
abort();
RandomPool randPool;
randPool.Put((byte *)seed, strlen(seed));
char outstr = new char[2pub.CipherTextLength()+1];
pub.Encrypt(randPool, (byte *)message, strlen(message), (byte *)outstr);
HexEncoder hexEncoder;
hexEncoder.Put((byte *)outstr, pub.CipherTextLength());
hexEncoder.MessageEnd();
hexEncoder.Get((byte *)outstr, 2*pub.CipherTextLength());
outstr[2*pub.CipherTextLength()] = 0;
return outstr;
char RSADecryptString(const char privFilename, const char *ciphertext)
FileSource privFile(privFilename, true, new HexDecoder);
RSAES_OAEP_SHA_Decryptor priv(privFile);
HexDecoder hexDecoder;
hexDecoder.Put((byte *)ciphertext, strlen(ciphertext));
hexDecoder.MessageEnd();
SecByteBlock buf(priv.CipherTextLength());
hexDecoder.Get(buf, priv.CipherTextLength());
char *outstr = new char[priv.MaxPlainTextLength()+1];
unsigned messageLength = priv.Decrypt(buf, (byte *)outstr);
outstr[messageLength] = 0;
return outstr; -
JNI and Tomcat running on Linux
Hi all!
I have a small problem with calling a native library from my Tomcat running on a linux.
The code is simple enough
System.loadLibrary(myLibrary);I know that when libmyLibrary.so isn't in the java.library.path I get an error at this line. When it is in the path it goes past this line with out problems but on the next line
myFunction(); that is a function within myLibrary i get something like
java.lang.UnsatisfiedLinkError: myFunction()The thing is. This exact code when either executed in a standalone java application or from a Tomcat running on windows works with out problem. Tomcat on linux doesn't.
myLibrary uses other libraries on a different path and my guess is that tomcat for some reason won't allow access to those. The security manager however doesn't give me any errors, nor does tomcat itself other than the UnsatisfiedLinkError.
Anyone running Tomcat on linux and using native libraries or perhaps just knows alot about this?
Please help. Thanks!Are you sure you are not running into a class loader issue? Does this occur the very first LoadLibrary call or after the first successfull call?
It could be that your JNI or bridge has already been loaded by another class loader in the tomcat class loader hierarchy and this would result in the UnsatisfiedLinkError.
Check out: http://www.onjava.com/pub/a/onjava/2004/06/30/classloader2.html -
HI !!!! Please, is there anybody outthere ?
We have a problem about using a packege that use a dll to cript-decprit data and java store procedure. We need to put in db oracle 9i the function to cript and decript data.So we need to use this. But using a dll with loadlibrary in oracle java store procedure seems impossibile!!!
Please,can you help us ?
Is there anybody whi have an idea ?
thank's,
andreaHi.
No, it isn't possibile ! IOracle don't let us to load library with JNI, jaust to avoid to waste db file or other. It seems a security policy of oracle itself, that limitate JVM.
But, it's incredible, we could use .dll ora c or c++ file in db, if we choose to not use java!! But, the package to manage security in our enterprise application is of the third part, not ours. So, how can we use a .jar library to cript and decript data in oracle ? Note that, we had this cripta and decripta under WLS, but we nedd to process one hundred thousand of data per day !! And http connection,...collapse we timeout problem....we want to put in java store procedure....or other, please! Help us!!!
thanks!
andrea -
Problems using JNI and JSP in WebLogic 6.0
Hello everybody. My problem is that I've got a Java class that is called from a JSP. That class connects to a C function and it returns a String. A want this string to be shown by the JSP. The code is:
JSP
<html>
<head>
<title>prueba JNI</title>
</head>
<body>
<%@ page import="ejemplosJNI.*, conversiones.*;"%>
<%
Texto texto = new Texto();
out.println(texto.realizado());
%>
</body>
</html>
Java class
package ejemplosJNI;
public class Texto
private native String getLine(String prompt);
String input = null;
public static void main(String args[])
Texto t = new Texto();
static
System.loadLibrary("MyImpOfPrompt");
public String realizado()
input = this.getLine("Mando una l�nea desde Java");
return input;
C function
#include <stdio.h>
#include <jni.h>
#include "Texto.h"
JNIEXPORT jstring JNICALL
Java_Texto_getLine(JNIEnv *env, jobject obj, jstring prompt)
char buf[128];
const char str = (env)->GetStringUTFChars(env, prompt, 0);
(*env)->ReleaseStringUTFChars(env, prompt, str);
return (*env)->NewStringUTF(env, str);
I compile de C function and put the .dll library in the 'bin' folder in webLogic.
When I call the JSP, I get the next exception:
Servlet failed with Exception
java.lang.UnsatisfiedLinkError: getLine
at ejemplosJNI.Texto.getLine(Native Method)
at ejemplosJNI.Texto.realizado(Texto.java:19)
at jsp_servlet._jsp._pruebasjni._prueba1._jspService(_prueba1.java:93)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:27)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubIm
pl.java:213)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubIm
pl.java:246)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppSe
rvletContext.java:1265)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestIm
pl.java:1622)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:137)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120)
Is there any place where I have to put the .dll?
Is there any place where I have to put the generated .lib?
Where do I have to put the Texto.h file generated with javah?
Can anybody help me to solve this problem?
Thanks in advance.Hi, jschell! Maybe you can see my problem if I give you the code. My Java class and the C funtions are:
Java class
package ejemplos.cadena;
public class Texto
private native String getLine(String prompt) throws Exception;
String cadenaFinal = null;
public static void main(String args[])
Texto t = new Texto();
static
System.loadLibrary("LibreriaCadena");
public String realizado(String cadena)
try
cadenaFinal = getLine(cadena);
catch(Exception e)
System.out.println(e.toString());
return cadenaFinal;
C code
#include <stdio.h>
#include <jni.h>
#include "ejemplos_cadena_Texto.h"
JNIEXPORT jstring JNICALL
Java_ejemplos_cadena_Texto_getLine(JNIEnv *env, jobject obj, jstring prompt)
int cero =0;
int division = 10 / cero;
const char str = (env)->GetStringUTFChars(env, prompt, 0);
(*env)->ReleaseStringUTFChars(env, prompt, str);
return (*env)->NewStringUTF(env, str);
I have done something like "int division = 10 / cero;" in order to get an exception in my C code. When I run my Java class I get an error message and the application breaks. I would like to know how to catch the C exception in order to pass it to my Java class that can manage it into the try-catch clause. I have read I have to use something like "FindClass" or "ThrowNew", but my problem is that I have no idea about C programming.
Can you help me?
Thanks for your time. -
JNI System.loadLibrary troubles
Hello again!
I am so close to finishing this program I can taste it! But�
OK, I am doing a bit of JNI. All appears to be well except my program can�t seem to use
System.loadLibrary("myCPPdll");
to find the dll file I need to run the C++ code.
I�ve tired replacement with
Runtime.getRuntime().loadLibrary("myCPPdll ");
just for grins with the same result.
I also tried
System.loadLibrary("C:/fullPath/myCPPdll");
with no luck.
The error message I get, regardless if I run from the command line or via Eclipse is
java.lang.UnsatisfiedLinkError: no myCPPdll in java.library.path.
Possibly related: when I use the tutorial form
Static
System.loadLibrary("myCPPdll");
my compiler tells me it can�t find the main. Just how critical is it to have it in this static format? It compiles great without the System call embedded in the static{} block!
Thanks for your time!I added the .dll and get the same error. It was my
understanding that System.loadLibrary(fileName)
automatically added the file to the library path for
the individual program in question. If this is not
the case, could you please elaborate a bit on adding
it to the path?
No, in effect it searches the path to find the dll library. You need to (re-)read the tutorial -
http://java.sun.com/docs/books/tutorial/native1.1/stepbystep/step5.html -
Hello guys,
I have created a JNI program.
There is C++ shared Library.
I'm working with Sun Solaris 2.5 and Java.1.3
When I run my program in the same package, there is no problem.
But when I create a package where I find my JNI program, it doesn't run correctly and he says me:
UnsatisfaiedLinkError: createInstance not found
But my native method exist.
example:
in a package A for the main:
import B.*;
import java.lang.*;
class toto {
public toto()
tata cl = new tata();
tata.createInstance();
static void main(String[] args)
toto tt = new toto();
in another package B
package B;
import java.lang.*;
class tata {
tata()
public native void createInstance();
static {
System.loadLibrary(tatalib);
There is an error with this version.
The version with no "package B;", no "import B.*;" and all the code in the same directory is good.
What is the problem ????
ThanksIn your C part, you have to specify the package name in which your Java class is running.
For example:
JNIEXPORT .... Java_a_createInstance(JNIEnv *, jobject ... )
Try that. That was my solution to something similar. -
Problem with JNI and Tomcat (and threads???)
Howdy,
Here is the issue - I would like some help on HOW to debug and fix this problem:
2 test use cases -
1)
a)User goes to Login.jsp, enters user and password
b) User submits to LoginServlet
c) login calls JNI code that connects to a powerbuilder(Yes I know this is ugly) PBNI code module (this is a .dll) that authenticates the user with the database
d) the servlet then redirects to another .jsp page
e) user then submits to LogoutServlet - also a JNI call to a powerbuilder PBNI code module
f) REPEAT STEPS a-e over a few times (inconsistent) and then the call to the JNI code hangs
2)
a) users does NOT goto Login.jsp, but rather calls LoginServlet and passes the userid and password as GET parms
b) user does NOT get redirected to a page (redirect code commented out)
c) user calls LogoutServlet
d) repeat steps a-c at will and no failure, no hanging
The only difference is that in case 1 (with JSP), there is a redirect and it afffected the JNI call by haniging inside JNI code.
In case 2 (without JSP) there is still a JNI call, but it does not hang. In addition, when it hangs and I stop Tomcat, the logs show cleanup entries that say:
Oct 19, 2004 9:17:09 AM org.apache.catalina.core.StandardWrapper unload
INFO: Waiting for 1 instance(s) to be deallocated
Oct 19, 2004 9:17:10 AM org.apache.catalina.core.StandardWrapper unload
INFO: Waiting for 1 instance(s) to be deallocated
Oct 19, 2004 9:17:11 AM org.apache.catalina.core.StandardWrapper unload
INFO: Waiting for 1 instance(s) to be deallocated
Is this a threading issue in Tomcat???
On would assume that the JNI code is not cleaning up after itself, but I don't believe this is the case,
and even if it was, why would I get the tomcat log cleanup entries above???
What do those cleanup entries imply about the state of Tomcat????hi ,
I met the same problem this morning, and searched the www.google.com in order to solve it, as a result, your article was shown on my screen. :)
Till now I have read some technical information and solved my problems. Maybe the solution be useful to you:
==============================
error message : (Environment : Tomcat 5, Windows 2003, Mysql5)
2006-3-29 11:53:48 org.apache.catalina.core.StandardWrapper unload
message: Waiting for 2 instance(s) to be deallocated
==============================
cause: the number of connection to database exceeded.another word,too many connections.
==============================
solution: close the connection when it becomes useless for your program. :)
==============================
ps. Sorry for my weak English . hehe .... -
Problem with JNI and Parallel Port dll
Hi. I'm doing some testes with JNI. Firs i followed the netbeans tutorial for doing a C programa that prints somthing for java.. like.. "Hello java from C".
So i tried to load a dll from my dll. Like, I have this dll to use the parallel port on windows Xp. So i created a dll to access it an comunicates eoth java.
I did everything just fine.
When I start my Java app, the first thing it does is to load this parallel port dll and configure the functions of it.
After that .. I get this error
EXCEPTION_FLT_STACK_CHECK (0xc0000092) at pc=0x0093d269, pid=2284, tid=3000
Can someone explain why ?
(Sorry if i wasn't clear enough, english is not my native language, so ask if you don't understand something.. )hi ,
I met the same problem this morning, and searched the www.google.com in order to solve it, as a result, your article was shown on my screen. :)
Till now I have read some technical information and solved my problems. Maybe the solution be useful to you:
==============================
error message : (Environment : Tomcat 5, Windows 2003, Mysql5)
2006-3-29 11:53:48 org.apache.catalina.core.StandardWrapper unload
message: Waiting for 2 instance(s) to be deallocated
==============================
cause: the number of connection to database exceeded.another word,too many connections.
==============================
solution: close the connection when it becomes useless for your program. :)
==============================
ps. Sorry for my weak English . hehe .... -
Hi there,
I have an application that makes use of JNI technology.
Basically, so as to work, the app must access a C++ DLL library via JNI, that in my case is a set of classes packaged in a jar file.
The app works just fine when is run locally, but I?m really in trouble to set up WebSphere properly so that I can web access the app with servlet and jsp.
I haven?t been succesful getting consistent info anywhere.
Could anybody give me detailed instructions on how to do that?
IBM instructions lack further details, they just don?t help, they?re made for experts!
Thanks!I have solved the previous problem, and fallen into another.
Now this is quite a wierd one. Basically, as the servlet is run from the browser, the servlet calls the business classes. The business classes use other java classes that have native methods to call a DLL library.
A have put the JNI java classes in the websphere class path, not in the web app classpath, as descrived in the IBM redbooks, and I also created the 'path' variable from the web project in WebSphere in reference to the DLL.
When I go to the browser and call the servlet, the app works, once I get all the info on the jsp that came from the DLL. Now, if any other call is done through the web browser, the dll is no more instantiated!
Neither from the same machine nor from anywhere else!
Has anybody ever seen such a thing?
I just don?t know what else to do, and have not found any more instructions.
Please, any info on it is very much welcome.
Thanks a lot. -
Hello all. These days i've been asked to make a little aplication for a PDA and while looking for information about j2me it says jni its not supported. But the app i need to make needs to use some library written in C, and my question is if there is any way o making an application in j2me that can use those libraries.
Thanks all.Yes i've found a compiler for my target platform and compiling and running the C libraries doesnt seem a problem at the time. My main problem is that I can't call them from my java application because jni is not supported and i dont know how to import them.
Thanks for your answer
Message was edited by:
trospito -
Hi !
We have a web-app that needs to make JNI calls to a DLL we wrote.
To be able to do that, we put that DLL in the WEB-INF/lib directory, set the PATH env. variable to ../WEB-INF/lib directory and added the env-entry tag to our web.xml file (that last part doesn't seem to do anything, under Windows, though).
Now, for test purposes, we would like to deploy the same application twice on the same OC4J instance. For that, we declared 2 different applications in the server.xml file and 2 web-apps in the http-web-site.xml file. Then, we had to have both lib directory into the PATH.
Note that we would like either application to use a different version of the same DLL, thus making it impossible to put the dll in a share directory.
The problem we have is that we can access our 2 web-apps without having to stop and start OC4J. The first launched web-apps works fine but the second web-app that is loaded doesn't seem to be able to reach it's own DLL (and refuses to load anything at all).
Is there something we are missing ?
Thanks for your Help.
OlivierFuther to my earlier post.
If I have say 6 applications open, all of which have designated spaces, then hitting the Expose key only works within a single application. If I disable Spaces then hitting the Expose key works fine and separates out each application on the screen.
Is this how Expose is meant to work?
I thought it would separate out each open window (example, of one of my 6 open applications is Mail, and I have 3 emails open, then hitting Expose would separate out every single window).
Would anyone like to clear my confusion?
Thanks
Maybe you are looking for
-
I have the iPhone 4S and would like to purchase a docking device. I have the Otter Box Camo case and would like to know which dock will work with the case ON. Thank you.
-
hi all, bapi_shipment_create is the bapi ,i want to use for the creation of shipment order but the structures & the fields inside that bapi is unfamiliar to me.so i need some samples so that i can follow. 1)i want to know which structures , i have
-
VF01 Issue: no accounting document generated
Dears, While Billing the Down Payment (VF01) in ETO case of IDES, the system issued a message: no accounting document generated. So the payment data can not be updated. Does anyone know how to solve this problem? Thx!
-
Download (documentation) the Message Mapping to client
Hi Gurus, is there any possibility to download the Message Mapping i have done in the PI to my local pc? I need this to document how i realized my mapping. I would be glad about tips and hints. Regards Udo
-
APP STORE NOT WORKING NO CREDIT CARD DOES NOT APPEAR
This is Absolute total stupidity: Thanks for making my day even worse where I have to create about 10 emails to even get an account OH WAIT I ALREADY DID. AND EVEN WORSE, THERE WAS STILL NO NONE OPTION Seriously apple, WHY?!??! --FappStore