Well the framework and API I am using are very large, so much so that it
would be unreasonable to rewrite them in Java. Sorry for the somewhat
unspecific question? Really I wanted to know why the class loader couldn't
find the jess.Rete class, when I have jess.jar on my classpath, and have it
in the directory where the c++ program executes.

Here is the c++ code where I create the JVM:

*#include <jni.h>*
*#include <cstdlib>*
*using namespace std;*
*int main() *
*{*
*     JNIEnv *env;*
*     JavaVM *jvm;*
*     jint res;*
*     jclass cls;*
*     jmethodID mid;*
*     jstring jstr;*
*     jclass stringClass;*
*     jobjectArray args;*
* *
*     JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */*
*     JavaVMOption* options = new JavaVMOption[1];*
*     options[0].optionString = (char*)&"-Djava.class.path=.";  //the
current directory is where jess.jar is also*
*     vm_args.version = JNI_VERSION_1_6;*
*     vm_args.nOptions = 1;*
*     vm_args.options = options;*
*     vm_args.ignoreUnrecognized = false;*
*
*
*     /* load and initialize a Java VM, return a JNI interface*
*      * pointer in env */*
*     JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);*
*     cls              = env->FindClass("TestJNIJessInvoke");*
*     mid            = env->GetStaticMethodID(cls, "main", **
"([Ljava/lang/String;)V");*
*     jstr             = env->NewStringUTF("");*
*     stringClass = env->FindClass("java/lang/String");*
*     args           = env->NewObjectArray(1, stringClass, jstr);*
*
*
*     env->CallStaticVoidMethod(cls, mid, args);*
* *
*     if (env->ExceptionOccurred()) *
*     {*
* env->ExceptionDescribe();*
*     }*
*     jvm->DestroyJavaVM();*
*}*


On Tue, Sep 27, 2011 at 11:58 AM, Dusan Sormaz <sor...@ohio.edu> wrote:

>  Hunter,
>
> This is not Jess specific question. JVM simply can not find Java class to
> load.
> Can you show snippet of the C++ code that starts jvm and tries to load
> TestJNIJessinvoke?
>
> As for overall design, is C++ requirement? Can you do it all in Java?
>
> Dusan Sormaz
>
>
> On 9/26/2011 8:51 PM, Hunter McMillen wrote:
>
> Hello everyone,
>
>   I am working on a project where I am using a C++ framework and API to
> create a game agent. My agent has to be flexible so it can react to/predict
> events that occur inside the game environment, Jess has the kind
> of flexibility that I need for my agent to be good,  but I am having trouble
> connecting to Jess from C++ and that is where I was hoping someone could
> help me out.
>
>  *What I am doing right now*
> I have a C++ program that starts a Java Virtual Machine and searches for a
> Java class file name "TestJNIJessInvoke"
>
>  Inside of "TestJNIJessInvoke.java" I define a simple function in Jess,
> and try to call that function then print the result
>  import jess.*;
> public class TestJNIJessInvoke
> {
>     public static void main(String[] args) throws JessException
>     {
>  Rete r = new Rete();
>  r.executeCommand("(deffunction square (?n) (return (* ?n ?n)))");
>  Value v = r.executeCommand("(square 3)");
>
>   System.out.println(v.intValue(r.getGlobalContext()));
>     }
> }
>
>  But when I try to compile and link the C++ file with:
> *cl *
> *   -I"C:\Program Files\Java\jdk1.7.0\include" *
> *   -I"C:\Program Files\Java\jdk1.7.0\include\win32" *
> *   TestJNIJessInvoke.cpp *
> *   -link "C:\Program Files\Java\jdk1.7.0\lib\jvm.lib"*
>  *
> *
> I get a class loader exception:
>  *Exception in thread "main" java.lang.NoClassDefFoundError: jess/Rete*
> *        at TestJNIJessInvoke.main(TestJNIJessInvoke.java:6)*
> *Caused by: java.lang.ClassNotFoundException: jess.Rete*
> *        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)*
> *        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)*
> *        at java.security.AccessController.doPrivileged(Native Method)*
> *        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)*
> *        at java.lang.ClassLoader.loadClass(ClassLoader.java:423)*
> *        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)*
> *        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)*
> *        ... 1 more*
>  *
> *
>  Exception in thread "main" java.lang.NoClassDefFoundError: jess/Rete
>         at TestJNIJessInvoke.main(TestJNIJessInvoke.java:6)
> Caused by: java.lang.ClassNotFoundException: jess.Rete
>         at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
>          at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
>         at java.security.AccessController.doPrivileged(Native Method)
>         at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
>         at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
>         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
>          at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
>         ... 1 more
>
>  *Questions*
>
>  1) Is there some other directory that I am supposed to be including that
> has the .class files for Jess? Right now all I am including is jess.jar
> 2) Is the general design I have a good idea? or is there a better way to
> facilitate communication between Jess and C++?
>
>
>
>  Thanks,
> Hunter McMillen
>
>
> --
> ***************************************************
> * Dusan Sormaz, PhD, Associate Professor
> * Ohio University
> * Department of Industrial and Systems Engineering
> * 284 Stocker Center, Athens, OH 45701-2979
> * phone: (740) 593-1545
> * fax:&nbsp;&nbsp; (740) 593-0778
> * e-mail: sor...@ohio.edu
> * url: http://oak.cats.ohiou.edu/~sormaz/
> ***************************************************
>
>

Reply via email to