This week's book giveaway is in the Servlets forum.
We're giving away four copies of Murach's Java Servlets and JSP and have Joel Murach on-line!
See this thread for details.
The moose likes Other JSE/JEE APIs and the fly likes JNI - return struct from C Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Murach's Java Servlets and JSP this week in the Servlets forum!
JavaRanch » Java Forums » Java » Other JSE/JEE APIs
Bookmark "JNI - return struct from C" Watch "JNI - return struct from C" New topic
Author

JNI - return struct from C

Ben Snyder
Greenhorn

Joined: Jul 02, 2002
Posts: 6
Hi folks

I'm having some trouble returning a C struct to Java using JNI. Currently I'm trying to use the javolution Struct library, though the documentation seems to be lacking. I have a small struct now, but will eventually have a
struct which contains pointers to other structs, char arrays, etc.

Here's what I have:

C Code:
typedef struct {
long count;
} Results;


JNIEXPORT jobject JNICALL Java_JTest_CTest (JNIEnv *env, jobject job) {
Results results;
results.count = 42;
printf("%li\n", results.count);
return (*env)->NewDirectByteBuffer(env, &results, sizeof(Results));
}



Java code:
class TestStruct extends Struct {
Signed32 count = new Signed32();
}

class JTest {
private native TestStruct CTest();
public static void main (String args[]) {

JTest jt = new JTest();

TestStruct ts = jt.CTest();
System.out.println(ts.count);
}

static {
System.loadLibrary("CTest");
}
}

Can someone either point me in the right direction, tell me what I'm doing wrong, or maybe there is something completely different I should be doing?

TIA,
-ben
Ernest Friedman-Hill
author and iconoclast
Marshal

Joined: Jul 08, 2003
Posts: 24183
    
  34

I can't critique the whole program, as I've never used this "javalution struct library" of which you speak, but I can tell you one bad, bad thing about your native code: the argument to NewDirectByteBuffer is supposed to be a pointer to a block of memory that will be staying put; but you're passing the address of a struct on the stack, which will turn into garbage as soon as the native function returns. You need to dynamically allocate (malloc, or new) your struct, or allocate it from a static array of structs, or something -- but you can't return stack-based objects from your JNI functions any more than you can return them within normal C(++) code.


[Jess in Action][AskingGoodQuestions]
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: JNI - return struct from C
 
Similar Threads
JNI and Objects as Params
jni methos in c++ class
CPU Time
Return a Structure Object from C to Java Through JNI
JNI Returns as Arguments