Re: jni oddness
Gordon Beaton wrote:
On Mon, 16 Apr 2007 12:13:19 +0100, Ian Malone wrote:
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.
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[i];
}
(*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.
--
imalone