This is all perfectly reasonable so far. When you create the JVM you'll need to 
tell it where jess.jar is, along with any other jars you use, with the "-cp" 
flag or the "java.class.path" property.

Once you have this working, you'll presumably want to connect things a little 
more tightly. You can use the JNI API to write the equivalent of your 
three-line main() in C++ pretty easily; you'll want to put together a C++ 
version "executeCommand()" that controls the Rete instance, passes a script 
along, executes it, and gets the Value back, decoding it as needed.


________________________________
From: owner-jess-us...@sandia.gov [mailto:owner-jess-us...@sandia.gov] On 
Behalf Of Hunter McMillen
Sent: Monday, September 26, 2011 8:51 PM
To: jess-users
Subject: JESS: Call Jess from C++ via JNI

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

Reply via email to