va_list in JNI

L

leonwild

Can anyone tell me if it is possible to call a C function which
contains a va_list parameter from java code. I have a existing library
that I wish to use by creating a Java wrapper around the code.
 
S

Stefan Schulz

Can anyone tell me if it is possible to call a C function which
contains a va_list parameter from java code. I have a existing library
that I wish to use by creating a Java wrapper around the code.

Depends on what you want to do. You can call a variadic function from JNI
code just fine, with the usual caveats. However, you can not use
C-Style variadic arguments to create a java-style variadic function.

In C, all arguments are pushed to the stack, and variadic functions
actually go "beyond" the last named argument further down the stack. In
java, variadic arguments actually _are_an_array_ of the declared type
(this is why you need to specify type... instead of just ...) that is
implicitly generated by the compiler once a variadic function is called.
 
L

leonwild

Basically I have C functions in a library which interface with a
duplicated database system. I don't have the luxury of modifying these
C functions. What I wanted to do was provide a bridge with JNI so I
could call the C functions from my Java code. Obviously when selecting
data you can have any number of columns and data types. The C functions
have prototypes like:

int select(char* table, char*columns, char* where, <va_list of
variables for data retrieval>)

Can you provide an example of how to pass the va_list parameters to the
C code so I can retreive the data? I suppose I could write callback
functions and seperate data structures but I'd like to stay as close to
the original code as possible.
 
S

Stefan Schulz

int select(char* table, char*columns, char* where, <va_list of
variables for data retrieval>)

Can you provide an example of how to pass the va_list parameters to the
C code so I can retreive the data? I suppose I could write callback
functions and seperate data structures but I'd like to stay as close to
the original code as possible.

How are these variables used? Are they used in scanf style (pointers to
locations?) or are they used as "rvalues", which can only be read, but
never assigned? If the former, you probably can't do it without jumping
through more hoops then it's worth. In the later, you might just be able
to get away with dirty tricks using the knowledge of how the stack is
organized. DO NOT DO THIS! Whoever will have to look at your program
afterwards will curse and all your progeny.

In general, this is quite a hard problem, since you will muck with
the stack layout (which is a disaster waiting to happen, and about as
importable as it gets). Are you sure you can not get away with a static
version of the function? va_list is, as defined, pretty much a read-only
structure, and creating one on the fly is not really intended.

If i where you, i would build an intermediate layer, instead of trying to
force-fit these parts together. But... your program, your problem, your
endless grief. ;)
 
L

leonwild

Thanks for the info. I think I'll write in an extra layer which will
pretend to be a bit like the JDBC but call my C library functions
underneath.

As you say, my headache. (But I've got plenty of paracetamol in my
desk, lol)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top