Well I am trying to create an agent to compete in the Starcraft AI
competition for next year, the API that the agents all use is called BWAPI:
http://code.google.com/p/bwapi/, but this is also a standard library that
some of the agents use that would be really useful for for my agent called
BWSAL: http://code.google.com/p/bwsal/. Anyway there is a native interface
that someone created for BWAPI, which I was planning on using in my code, so
my plan was to create a native interface for BWSAL, that way I could do all
the Jess interaction inside of Java, then call associated methods in C++ via
JNI. Does this sound far-fetched?

On Thu, Sep 29, 2011 at 5:10 PM, Socrates Frangis <soc.fran...@gmail.com>wrote:

> 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
> fidelity.
>
>
> 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
>>>
>>>
>>
>
>
> --
> V/R
> -Socrates Frangis
> -Mathematician & Software Engineer
>

Reply via email to