i have been working on reading c#(dll) function java through jni4net , in core java have succeeded in getting value dll function have created 1 dynamic web project , tried use same functionality in servlet. dll file loaded succesfully, function not called succesfuly. below tried till now:
my servlet:
public class loginprocess extends httpservlet { private static final long serialversionuid = 1l; protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { try { bridge.setverbose(true); bridge.init(); console.writeline("hello .net world!\n"); bridge.loadandregisterassemblyfrom(new file("c:/users/ashish.it/workspace/finaljniweb/webcontent/web-inf/lib/adhelper.j4n.dll")); } catch (ioexception e) { e.printstacktrace(); } enum output; output=adhelper.login("user", "pass"); system.out.println(output); } }
the difference when made in core java didn't used complete path instead used "lib/adhelper.j4n.dll" path somehow not working in servlet changed complete path. anyways dll file loaded succesfully.
adhelper.generated.cs
namespace adhelper { public partial class adhelper_ { methods.add(global::net.sf.jni4net.jni.jninativemethod.create(@__type, "login", "login2", "(ljava/lang/string;ljava/lang/string;)lsystem/enum;")); private static global::net.sf.jni4net.utils.jnihandle login2(global::system.intptr @__envp, global::net.sf.jni4net.utils.jnilocalhandle @__class, global::net.sf.jni4net.utils.jnilocalhandle username, global::net.sf.jni4net.utils.jnilocalhandle password) { // (ljava/lang/string;ljava/lang/string;)lsystem/enum; // (lsystem/string;lsystem/string;)ladhelper/adhelper+loginresult; global::net.sf.jni4net.jni.jnienv @__env = global::net.sf.jni4net.jni.jnienv.wrap(@__envp); global::net.sf.jni4net.utils.jnihandle @__return = default(global::net.sf.jni4net.utils.jnihandle); try { @__return = global::net.sf.jni4net.utils.convertor.strongc2jp<global::adhelper.adhelper.loginresult>(@__env, global::adhelper.adhelper.login(global::net.sf.jni4net.utils.convertor.strongj2cstring(@__env, username), global::net.sf.jni4net.utils.convertor.strongj2cstring(@__env, password))); }catch (global::system.exception __ex){@__env.throwexisting(__ex);} return @__return; } }
the underdscore mingled name adhelper class when ran proxygen command. in dll file there 2 classes named adhelper , adhelper
the function login() changed login2() login2() not recognized servlet whereas login() recognized.
generated java class adhelper.java
package adhelper; @net.sf.jni4net.attributes.clrtype public class adhelper extends system.object { private static system.type statictype; protected adhelper(net.sf.jni4net.inj.injenv __env, long __handle) { super(__env, __handle); } @net.sf.jni4net.attributes.clrconstructor("()v") public adhelper() { super(((net.sf.jni4net.inj.injenv)(null)), 0); adhelper.adhelper.__ctoradhelper0(this); } @net.sf.jni4net.attributes.clrmethod("(lsystem/string;lsystem/string;)ladhelper/adhelper+loginresult;") public native static system.enum login(java.lang.string username, java.lang.string password); public static system.type typeof() { return adhelper.adhelper.statictype; } private static void initjni(net.sf.jni4net.inj.injenv env, system.type statictype) { adhelper.adhelper.statictype = statictype; } }
all mapping correct login function giving unsatisfiedlinkerror. having patience while reading, please give solution problem.
following error coming on console:
*all dll file loaded message* jun 3, 2015 10:56:39 org.apache.catalina.core.standardwrappervalve invoke severe: servlet.service() servlet loginprocess threw exception java.lang.unsatisfiedlinkerror: adhelper.adhelper.login(ljava/lang/string;ljava/lang/string;)lsystem/enum; @ adhelper.adhelper.login(native method) @ com.karvy.login.loginprocess.doget(loginprocess.java:62) @ javax.servlet.http.httpservlet.service(httpservlet.java:617) @ javax.servlet.http.httpservlet.service(httpservlet.java:723) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:290) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:233) @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:191) @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:127) @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:103) @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:109) @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:293) @ org.apache.coyote.http11.http11processor.process(http11processor.java:861) @ org.apache.coyote.http11.http11protocol$http11connectionhandler.process(http11protocol.java:606) @ org.apache.tomcat.util.net.jioendpoint$worker.run(jioendpoint.java:489) @ java.lang.thread.run(thread.java:662)
maybe can test class-loader loading file different class-loaders in different context.
Comments
Post a Comment