You might want to take a look at how Apache jsvc sets up the jvm: http://commons.apache.org/daemon/jsvc.html
That might give you some clues. Allen Reese Core Platforms Yahoo!, Inc. > -----Original Message----- > From: sdenning [mailto:sdenn...@rocketmail.com] > Sent: Friday, August 05, 2011 7:24 AM > To: users@activemq.apache.org > Subject: ActiveMQ JNI problem - simple config problem or compatibility issue? > > Are there any inherent compatibility issues with ActiveMQ and JNI? Maybe > I've got a simple configuration issue. I don't see any clean examples that > use ActiveMQ and JNI. This code worked for another jms provider. > > Platform: Windows XP > C++ Compiler: Visual Studio 6.0 > Java version: java 1.6 > Activemq version: 5.4.2 > > Application: C++ application that uses JNI to create JVM to access ActiveMQ > topics. > The POJO app works fine with same java code that accesses Activemq that is > also > running on this machine, but when loaded in via JNI I get: > > javax.naming.NoInitialContextException: Cannot instantiate class: > org.apache.activemq.jndi.ActiveMQInitialContextFactory [Root exception is > java.lang.ClassNotFoundException: > org/apache/activemq/jndi/ActiveMQInitialContextFactory] > > when javax.naming.InitialContext(props) is called with (IP changed to > protect the innocent): > java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory > java.naming.provider.url=tcp://555.555.555.555:61616 > java.naming.security.principal=defaultUser > java.naming.security.credentials=defaultPassword > > I've run with -verbose:class and verified the classpath is correct by > forcing an instanciation of ActiveMQInitialContextFactory and see: > [Loaded org.apache.activemq.jndi.ActiveMQInitialContextFactory from > file:/C.../activemq-all-5.4.2.jar] > > Here's the basic JNI code: > classPath = "-Djava.class.path=" + classPath; > dsoPath = "-Djava.library.path=" + dsoPath; > > std::cout << "Path2: "<< (char*)classPath.c_str() << std::endl; > JavaVMOption options[3]; > options[0].optionString = (char*)classPath.c_str(); > options[1].optionString = (char*)dsoPath.c_str(); > options[2].optionString = "-verbose:class"; //class|gc|jni > > mJvmArgs.version = JNI_VERSION_1_6; > // Tried using 1_4, but it produced same exception > //mJvmArgs.version = JNI_VERSION_1_4; > mJvmArgs.options = options; > mJvmArgs.nOptions = 3; > mJvmArgs.ignoreUnrecognized = JNI_FALSE; > > if (JNI_CreateJavaVM(&gJvm, (void**)&mJvmEnv, &mJvmArgs) < 0) > > The class loading is suspicious for InitialContext. With the POJO the class > loading looks like: > [Loaded com.sun.naming.internal.ResourceManager from rt.jar] > [Loaded com.sun.naming.internal.VersionHelper from rt.jar] > [Loaded com.sun.naming.internal.VersionHelper12 from rt.jar] > [Loaded com.sun.naming.internal.VersionHelper12$2 from rt.jar] > [Loaded com.sun.naming.internal.VersionHelper12$6 from rt.jar] > [Loaded com.sun.naming.internal.VersionHelper12$5 from rt.jar] > [Loaded javax.naming.NamingEnumeration from rt.jar] > [Loaded com.sun.naming.internal.VersionHelper12$InputStreamEnumeration from > rt.jar] > [Loaded com.sun.naming.internal.VersionHelper12$InputStreamEnumeration$1 > from rt.jar] > [Loaded com.sun.naming.internal.VersionHelper12$4 from rt.jar] > [Loaded javax.naming.spi.NamingManager from rt.jar] > [Loaded javax.naming.spi.InitialContextFactory from rt.jar] > [Loaded org.apache.activemq.jndi.ActiveMQInitialContextFactory from > file:activemq-all-5.4.2.jar > > But the class loading in the c++ app that uses JNI to create a JVM: > [Loaded javax.naming.InitialContext from rt.jar] > [Loaded com.sun.naming.internal.ResourceManager from rt.jar] > [Loaded com.sun.naming.internal.VersionHelper from rt.jar] > [Loaded com.sun.naming.internal.VersionHelper12 from rt.jar] > [Loaded com.sun.naming.internal.VersionHelper12$2 from rt.jar] > [Loaded com.sun.naming.internal.VersionHelper12$6 from rt.jar] > [Loaded com.sun.naming.internal.VersionHelper12$5 from rt.jar] > >>[Loaded sun.misc.URLClassPath$2 from rt.jar] > >>[Loaded java.lang.ClassLoader$2 from rt.jar] > >>[Loaded sun.misc.URLClassPath$1 from rt.jar] > >>[Loaded java.net.URLClassLoader$3 from rt.jar] > >>[Loaded sun.misc.CompoundEnumeration from rt.jar] > >>[Loaded javax.naming.NamingEnumeration from rt.jar] > >>[Loaded com.sun.naming.internal.VersionHelper12$InputStreamEnumeration > from rt.jar] > >>[Loaded com.sun.naming.internal.VersionHelper12$InputStreamEnumeration$1 > from rt.jar] > >>[Loaded java.net.URLClassLoader$3$1 from rt.jar] > >>[Loaded com.sun.naming.internal.VersionHelper12$4 from rt.jar] > >>[Loaded javax.naming.spi.NamingManager from rt.jar] > >>[Loaded javax.naming.NoInitialContextException from rt.jar] > > Note, I've also put the jndi.properties into the jar that I'm loading that > has the properties for finding the activeMQ server. Any ideas are greatly > appreciated. > Thanks! > > -- > View this message in context: > http://activemq.2283324.n4.nabble.com/ActiveMQ-JNI-problem-simple- > config-problem-or-compatibility-issue-tp3721325p3721325.html > Sent from the ActiveMQ - User mailing list archive at Nabble.com.