jni oddness

I

Ian Malone

Hi, I was wondering if anyone could suggest
reasons the following might be misbehaving.

I've followed the IBM JNI tutorial
<http://www-128.ibm.com/developerworks/edu/j-dw-javajni-i.html>.
IT works fine on Windows with jdk1.5.0_11
and Visual C++ 6. I've also tried it on
Fedora Core 6, using gcc -shared to compile
the C code and Sun's jdk1.5.0_10. Everything
seems to work except that the sum over the
integer array does not return the correct
result. This is particularly bizarre because
setting the result individually to elements
of the array shows them to be correct.

Anything I could be trying to fix this behaviour?
 
G

Gordon Beaton

Everything seems to work except that the sum over the integer array
does not return the correct result. This is particularly bizarre
because setting the result individually to elements of the array
shows them to be correct.

Anything I could be trying to fix this behaviour?

What is "it"?

We are not mindreaders. Without seeing your code it's virtually
impossible to see what the problem is.

The tutorial you refer to requires registration, so you need to
provide enough information in your post to make it possible for people
to help you.

/gordon

--
 
I

Ian Malone

Gordon said:
What is "it"?

We are not mindreaders. Without seeing your code it's virtually
impossible to see what the problem is.

The tutorial you refer to requires registration, so you need to
provide enough information in your post to make it possible for people
to help you.


Sorry, as it's pretty much the only JNI tutorial
in existence I'd assumed it would be well known:

Sample1.java:

public class Sample1
{
public native int intMethod(int n);
public native boolean booleanMethod(boolean bool);
public native String stringMethod(String text);
public native int intArrayMethod(int[] intArray);

public static void main(String[] args)
{
System.loadLibrary("Sample1");
Sample1 sample = new Sample1();
int square = sample.intMethod(5);
boolean bool = sample.booleanMethod(true);
String text = sample.stringMethod("JAVA");
int sum = sample.intArrayMethod(
new int[]{1,1,2,3,5,8,13} );

System.out.println("intMethod: " + square);
System.out.println("booleanMethod: " + bool);
System.out.println("stringMethod: " + text);
System.out.println("intArrayMethod: " + sum);
}
}

Sample1.c:

#include "Sample1.h"
#include <string.h>

JNIEXPORT jint JNICALL Java_Sample1_intMethod
(JNIEnv *env, jobject obj, jint num) {
return num * num;
}

JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod
(JNIEnv *env, jobject obj, jboolean boolean) {
return !boolean;
}

JNIEXPORT jstring JNICALL Java_Sample1_stringMethod
(JNIEnv *env, jobject obj, jstring string) {
const char *str = (*env)->GetStringUTFChars(env, string, 0);
char cap[128];
strcpy(cap, str);
(*env)->ReleaseStringUTFChars(env, string, str);
return (*env)->NewStringUTF(env, strupr(cap));
}

JNIEXPORT jint JNICALL Java_Sample1_intArrayMethod
(JNIEnv *env, jobject obj, jintArray array) {
int i, sum = 0;
jsize len = (*env)->GetArrayLength(env, array);
jint *body = (*env)->GetIntArrayElements(env, array, 0);
for (i=0; i<len; i++)
{ sum += body;
}
(*env)->ReleaseIntArrayElements(env, array, body, 0);
return sum;
}


Sample1.h created by running javah on Sample1.java.
Though it occurs to me that I did this on the Windows
machine and copied the result to the Linux system;
is this a possible cause? The problem is occuring
in the summation in Java_Sample1_intArrayMethod.
 
G

Gordon Beaton

Sorry, as it's pretty much the only JNI tutorial in existence I'd
assumed it would be well known:

Previously there was a JNI tutorial at java.sun.com. There's also the
JNI spec included in the JDK documentation package, and the Sheng
Liang book available online. I wasn't aware of the JNI tutorial at
IBM.
Sample1.h created by running javah on Sample1.java. Though it occurs
to me that I did this on the Windows machine and copied the result
to the Linux system; is this a possible cause? The problem is
occuring in the summation in Java_Sample1_intArrayMethod.

The code you posted works fine for me on Linux (I get 33).

This is how I compiled it with gcc:

gcc -Wall -fPIC -I $JDK/include -I$JDK/include/linux -c Sample1.c
gcc -shared Sample1.o -o libSample1.so

Try generating Sample1.h on the linux machine. If that doesn't help,
use printf() to display the value of len at the start of
intArrayMethod, and each body value as you add them in the loop.

/gordon

--
 
I

Ian Malone

Previously there was a JNI tutorial at java.sun.com. There's also the
JNI spec included in the JDK documentation package, and the Sheng
Liang book available online. I wasn't aware of the JNI tutorial at
IBM.

Thanks, I hadn't realised the Liang book was online.
The code you posted works fine for me on Linux (I get 33).

<bangs head on desk> Sorry, a misplaced semicolon had crept
in (I now notice it's in the copy on the Windows machine...).
Thanks for your help.
 
G

Gordon Beaton

<bangs head on desk> Sorry, a misplaced semicolon had crept in (I
now notice it's in the copy on the Windows machine...).

Yet another reason it's better to cut and past from real non-working
code when posting, rather than referring to a website that doesn't
actually have the error in it...

/gordon

--
 

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,995
Messages
2,570,236
Members
46,822
Latest member
israfaceZa

Latest Threads

Top