LiamOB
asked on
Efficient way to load a linked list C like datastructure
Hi guys,
I'm looking for an efficient and clean way to fill up a linked list datastructure that I use with JNI to interface with a C program. I have to use this same structure as a parameter when calling the JNI again.
The first class is the class I want to fill up and as you can see there is a pointer to the next structure p_next_rec
And below that is a snippet of how I'm currently proposing on implementing what I want to do but I was wondering if there is a better way.
(Note I haven't run this through a compiler only wrote it in notepad so not too worried about minor syntax errors if there is any).
I'm looking for an efficient and clean way to fill up a linked list datastructure that I use with JNI to interface with a C program. I have to use this same structure as a parameter when calling the JNI again.
The first class is the class I want to fill up and as you can see there is a pointer to the next structure p_next_rec
And below that is a snippet of how I'm currently proposing on implementing what I want to do but I was wondering if there is a better way.
(Note I haven't run this through a compiler only wrote it in notepad so not too worried about minor syntax errors if there is any).
//Class that is similar to what I'm using which is part of the JNI
public class API_DATASTRUCTURE_T implements Serializable, Cloneable
{
// Fields
public static String[] _meths;
private API_DATASTRUCTURE_T p_next_rec;
private String name;
// Constructors
public API_DATASTRUCTURE_T() { }
// Methods
public API_DATASTRUCTURE_T getP_next_rec() { return null;}
public String get_name() { return null;}
private static native void initFIDs();
public void setP_next_rec(API_DATASTRUCTURE_T aPI_DATASTRUCTURE_T) { }
public void setname(String string) { }
}
//Snippet of code to fill up the above structure
//this variable will be my final object that is full with data
API_DATASTRUCTURE_T setupDataStructure = new API_DATASTRUCTURE_T();
//Use this variable to keep a pointer reference when traversing the structure above
API_DATASTRUCTURE_T pointerToNextStructure = new API_DATASTRUCTURE_T();
//this is a collection with the names
Iterator<String> dataIt = collectionWithData.iterator();
//Fill first structure
if(dataIt.hasNext())
{
setupDataStructure.setname(dataIt.next());
}
//if we have more than one then keep a pointer reference so we can traverse the structure
if(dataIt.hasNext())
{
pointerToNextStructure = setupDataStructure;
}
while(dataIt.hasNext())
{
//place holder for data for each iteration.
API_DATASTRUCTURE_T placeHolder = new API_DATASTRUCTURE_T();
//setting name
placeHolder.setname(dataIt.next());
pointerToNextStructure.setP_next_rec(placeHolder);
//Traversing through the structure while keeping a reference to the pointer
pointerToNextStructure = pointerToNextStructure.getP_next_rec();
}
//WHEN I GET HERE I CAN USE setupDataStructure which is now full with data.
ASKER
Are you proposing I change API_DATASTRUCTURE_T class?
If you are then unfortunately I can't, this is a very large scale program and this class is auto generated as part of our JNI infrastructure. So I don't have an option of changing API_DATASTRUCTURE_T class.
If you are then unfortunately I can't, this is a very large scale program and this class is auto generated as part of our JNI infrastructure. So I don't have an option of changing API_DATASTRUCTURE_T class.
If it's auto-generated, then don't worry about names.
Otherwise, just keep a reference to the head and tail of the list and fill it with elements from your collection
Otherwise, just keep a reference to the head and tail of the list and fill it with elements from your collection
If efficiency is what you are really after and the use of JNI with C is already a committed decision then consider outsourcing the serialization/deserializat ion of the API_DATASTRUCTURE_T to the native side of things. That way you could either implement the serialized list as a sequence of records in a file (formatted appropriately for C file semantics) or as a memory mapped file with the mapping to a fixed virtual address or with non-pointer mechanisms (e.g. relative offsets) used to connect things together.
While I don't have the JNI reference handy, I recall that JNI had everything necessary to expose structures on the native side as Java objects to the JVM. You could even implement iterator semantics on a collection of these beasts.
While I don't have the JNI reference handy, I recall that JNI had everything necessary to expose structures on the native side as Java objects to the JVM. You could even implement iterator semantics on a collection of these beasts.
ASKER
CEHJ: I don't understand what you mean when you say "don't worry about names"?? are you talking where I set the name? if so this is just a variable I have to set, in reality there is more variables other than name.
KenClement: This is a large scale project and I don't have time to investigate what you said, I'm just looking for a clean way to implement this in Java in the current format that is presented to me. Thanks for the comment though.
KenClement: This is a large scale project and I don't have time to investigate what you said, I'm just looking for a clean way to implement this in Java in the current format that is presented to me. Thanks for the comment though.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks guys for your comments, I gave the points between anyone that helped, the most points for objects as he used a bit of code. I ended up tweaking my code a different way but not much really. Thanks again anyway.
Open in new window