Reputation: 5263
I'm trying JNI sample code.
(You can get all below sources through github: https://github.com/pilhoon/jni-test )
public class Sample { 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("sample"); Sample sample = new Sample(); 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); } }
#include "sample.h" #include <string.h> #ifdef __cplusplus extern "C" { #endif JNIEXPORT jint JNICALL Java_Sample_intMethod (JNIEnv *env, jobject obj, jint num) { return num * num; } JNIEXPORT jboolean JNICALL Java_Sample_booleanMethod (JNIEnv *env, jobject obj, jboolean boolean) { return !boolean; } JNIEXPORT jstring JNICALL Java_Sample_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_Sample_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; iReleaseIntArrayElements(env, array, body, 0); return sum; } void main(){} #ifdef __cplusplus } #endif
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class Sample */ #ifndef _Included_Sample #define _Included_Sample #ifdef __cplusplus extern "C" { #endif /* * Class: Sample * Method: intMethod * Signature: (I)I */ JNIEXPORT jint JNICALL Java_Sample_intMethod (JNIEnv *, jobject, jint); /* * Class: Sample * Method: booleanMethod * Signature: (Z)Z */ JNIEXPORT jboolean JNICALL Java_Sample_booleanMethod (JNIEnv *, jobject, jboolean); /* * Class: Sample * Method: stringMethod * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_Sample_stringMethod (JNIEnv *, jobject, jstring); /* * Class: Sample * Method: intArrayMethod * Signature: ([I)I */ JNIEXPORT jint JNICALL Java_Sample_intArrayMethod (JNIEnv *, jobject, jintArray); #ifdef __cplusplus } #endif #endif
And I compiled these with gcc on CentOS 6.3
prompt$ gcc -c -o sample.o -fPIC sample.c -I /usr/java/jdk1.7.0_07/include/ -I /usr/java/jdk1.7.0_07/include/linux/ prompt$ gcc -shared -o libsample.so sample.o
But when I run 'java Sample', an error occurs.
java: symbol lookup error: /home/ph/tmp/jni/libsample.so: undefined symbol: strupr
How can I fix this?
Upvotes: 2
Views: 3235
Reputation: 1100
Java seems to have problems with JNI libraries using other libraries. I have the same problem at the moment, where I want to make a JNI library using glib. Java doesn't want to know the glib functions, though everything compiled and linked fine.
So if you write JNI libs, you can not use any other libs from that code!
Edit: Link any libs statically into your JNI lib. That should work!
Upvotes: -1
Reputation: 1765
strupr is not standard ANSI C. If you write a native C application that references strupr, you will get a link error similar to what you are seeing
$ gcc -o sample -fPIC Sample.c -I /xxx/include/ -I /xxx/include/linux/
Sample.c: In function âJava_Sample_stringMethodâ:
Sample.c:23: warning: passing argument 2 of â(*env)->NewStringUTFâ makes pointer from integer without a cast
Sample.c: In function âmainâ:
Sample.c:40: warning: passing argument 1 of âprintfâ makes pointer from integer without a cast
/tmp/cc6hPBKz.o: In function `Java_Sample_stringMethod':
Sample.c:(.text+0xaa): undefined reference to `strupr'
/tmp/cc6hPBKz.o: In function `main':
Sample.c:(.text+0x103): undefined reference to `strupr'
collect2: ld returned 1 exit status
Solution is to write your own strupr routine.
Upvotes: 2
Reputation: 1804
Have you tried compiling the C file after including stdio.h
and/or string.h
?
Upvotes: 2