How do I link against my own library? [Solved]

This is where you talk about the NXJ software itself, installation issues, and programming talk.

Moderators: roger, 99jonathan, imaqine

How do I link against my own library? [Solved]

Postby clintonb » Sat Jan 05, 2013 7:12 am

Greetings.

I'm refactoring some code. It is analogous to this:

Code: Select all
// Monolithic/Dynamic.java

import lejos.nxt.Button;

public class Dynamic extends Static {
   public static void main (String[] args) {
      System.out.println("Hello World");
       Button.waitForAnyPress();
   }
   private UsefulClass uc;
}

class Static { }

class UsefulClass { }


I compile and link it by running:

Code: Select all
nxjc Dynamic.java
nxjlink -o out.nxj Dynamic


And afterwards, I have the files:

Dynamic.class
Static.class
out.nxj
Dynamic.java
UsefulClass.class

in the directory.


Now, this is messy. (Believe me!) The dynamic class changes, but the other classes it depends upon do not. I'd like to put them into a .jar file, and link against it.

Here are the files I will create in an attempt to do that:

BaseDirectory/MyPackage/Static.java
BaseDirectory/MyPackage/UsefulClass.java
BaseDirectory/Elsewhere/Dynamic.java

The files to go in the package are as follows:

Code: Select all
// MyPackage/Static.java
package MyPackage;

public class Static { }


Code: Select all
// MyPackage/UsefulClass.java
package MyPackage;

public class UsefulClass { }


I go into the BaseDirectory and create a library as follows:

Code: Select all
nxjc MyPackage/*.java
jar cvf MyPackage.jar MyPackage/*.class


Now I have:

BaseDirectory/MyPackage/Static.class
BaseDirectory/MyPackage/Static.java
BaseDirectory/MyPackage/UsefulClass.class
BaseDirectory/MyPackage/UsefulClass.java
BaseDirectory/MyPackage.jar

Finally, I create the dynamic class, in BaseDirectory/Elsewhere/Dynamic.java. (I'm hoping that this file can be anywhere, so long as it can access the .jar library file):

Code: Select all
// Elsewhere/Dynamic.java

import lejos.nxt.Button;
import MyPackage.*;

public class Dynamic extends Static {
   public static void main (String[] args) {
      System.out.println("Hello World");
       Button.waitForAnyPress();
   }
   private UsefulClass uc;
}


I go into Elsewhere, and compile it:

Code: Select all
nxjc -cp ../MyPackage.jar Dynamic.java


Great. Now I try to link it, like this:

Code: Select all
nxjlink -o out.nxj -cp ../MyPackage.jar Dynamic


And get a bunch of error messages:

Code: Select all
js.tinyvm.TinyVMException: Class Dynamic (file Dynamic.class) not found in CLASSPATH /Users/clinton/Development/Enchanting/EnchantingTrunk/ThirdParty/lejos_nxj/bin/../lib/nxt/classes.jar:../MyPackage.jar
   at js.tinyvm.ClassRecord.getClassRecord(ClassRecord.java:855)
   at js.tinyvm.Binary.processClasses(Binary.java:362)
   at js.tinyvm.Binary.createFromClosureOf(Binary.java:309)
   at js.tinyvm.TinyVMTool.link(TinyVMTool.java:97)
   at js.tinyvm.TinyVMTool.link(TinyVMTool.java:48)
   at lejos.pc.tools.NXJLink.start(NXJLink.java:134)
   at lejos.pc.tools.NXJLink.run(NXJLink.java:101)
   at lejos.pc.tools.NXJLink.start(NXJLink.java:33)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at lejos.pc.tools.ToolStarter.startTool(ToolStarter.java:31)
   at lejos.pc.tools.NXJLink.main(NXJLink.java:28)


I've tried some variations, like this:

Code: Select all
nxjlink -o out.nxj -cp ../MyPackage.jar -cp . Dynamic


Getting:

Code: Select all
js.tinyvm.TinyVMException: Class MyPackage.Static (file MyPackage/Static.class) not found in CLASSPATH /Users/clinton/Development/Enchanting/EnchantingTrunk/ThirdParty/lejos_nxj/bin/../lib/nxt/classes.jar:.
   at js.tinyvm.ClassRecord.getClassRecord(ClassRecord.java:855)
   at ... ... ...


Clearly, I haven't quite got it yet. What is the proper command to link my dynamic java file against my custom library?

Thanks,
Clinton
Last edited by clintonb on Sat Jan 05, 2013 3:04 pm, edited 1 time in total.
clintonb
Active User
 
Posts: 82
Joined: Fri May 28, 2010 1:44 am
Location: Cardston, Alberta, Canada

Re: How do I link against my own library?

Postby clintonb » Sat Jan 05, 2013 1:30 pm

I should've looked more at how Java is invoked after you compile something. [url=http://docs.oracle.com/javase/tutorial/ext/basics/install.html]This documentation[url] helped me infer the right code, which is:

Code: Select all
nxjlink -o out.nxj -cp .:../MyPackage.jar Dynamic


Interestingly enough, to me, anyways, this does not work: nxjlink -o out.nxj -cp . -cp ../MyPackage.jar Dynamic

Cheers,
Clinton
clintonb
Active User
 
Posts: 82
Joined: Fri May 28, 2010 1:44 am
Location: Cardston, Alberta, Canada

Re: How do I link against my own library?

Postby skoehler » Sat Jan 05, 2013 7:24 pm

clintonb wrote:Interestingly enough, to me, anyways, this does not work: nxjlink -o out.nxj -cp . -cp ../MyPackage.jar Dynamic


The latter -cp overrides the former. That's also the behaviour of the java command.
Using -cp .:../MyPackage.jar is exactly the right thing to do.
skoehler
leJOS Team Member
 
Posts: 1114
Joined: Thu Oct 30, 2008 4:54 pm


Return to NXJ Software

Who is online

Users browsing this forum: Google [Bot] and 1 guest

cron
more stuff