What framework are you using? Curious to see how it is invoking JNI.

"using this I think I can only interact with Jess in my Java program then
pass data from my Java code to C++"
-Unless your framework has an API supporting JESS specifically, i doubt that
is the case.  It should be providing a 'simpler' implementation to access
your java classes but that would just eliminate the cryptic path declaration
and still give you an interface to what youre playing with.

Overall opinion, given the chance that your framework may inhibit full
controll of the Rete engine or using JESS (and for the learning experience)
i would recommend sticking with your current implementation.  Rule engines
require precise attention to detail and i wouldn't risk the chance of losing

On Wed, Sep 28, 2011 at 2:22 PM, Hunter McMillen <mcmil...@gmail.com> wrote:

> Sorry to pester you with more questions.
> The way I am currently doing things in invoking a JVM from C++ to call Java
> code that calls/interacts with Jess code, but it turns out that someone has
> actually created a java native interface for the api/framework I am using to
> make my agent, using this I think I can only interact with Jess in my Java
> program then pass data from my Java code to C++, I was wondering if you
> thought this would be a better solution than invoke a JVM from C++
> Thanks
> Hunter
> On Tue, Sep 27, 2011 at 12:03 PM, Friedman-Hill, Ernest <
> ejfr...@sandia.gov> wrote:
>> **
>> 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

-Socrates Frangis
-Mathematician & Software Engineer

Reply via email to