Java 获取并打印JNI中的字符串数组
我是JNI的新手,所以我不知道如何获取字符串数组,我在stackoverflow中读了很多问题,也读了JNI编程指南,但对我来说很难:( 经过很长一段时间,我想出了这个代码,但它没有工作Java 获取并打印JNI中的字符串数组,java,linux,arrays,string,java-native-interface,Java,Linux,Arrays,String,Java Native Interface,我是JNI的新手,所以我不知道如何获取字符串数组,我在stackoverflow中读了很多问题,也读了JNI编程指南,但对我来说很难:( 经过很长一段时间,我想出了这个代码,但它没有工作 class ReadString2 { private int i; private static String[] StringBuf; private native void readS(String[] StringBuf); /*Constructor of ReadS
class ReadString2 {
private int i;
private static String[] StringBuf;
private native void readS(String[] StringBuf);
/*Constructor of ReadString*/
public ReadString2() {
// StringBuf = "This is exercise number 1";
StringBuf = new String[5];
StringBuf[0] = new String("123");
StringBuf[1] = new String("456");
StringBuf[2] = new String("789");
StringBuf[3] = new String("\0");
StringBuf[4] = new String("\0");
}
public static void main(String[] args) {
ReadString2 p = new ReadString2();
p.readS(StringBuf);
}
static {
System.loadLibrary("ReadString2");
}
}
//=========================C==================
#include <jni.h>
#include <stdio.h>
#include "ReadString2.h"
JNIEXPORT void JNICALL
Java_ReadString2_ReadS(JNIEnv *env,jobject obj, jobjectArray StringBuf)
{
jsize stringCount = (*env)->GetArrayLength(env, StringBuf);
const jbyte *str;
jstring stringGet;
int i;
if (str == NULL) {
//return NULL;
}
for (i = 0; i <= stringCount; i++) {
stringGet = (*env)->GetObjectArrayElement(env, StringBuf, i);
str = (*env)->GetStringUTFChars(env, stringGet, NULL);
printf("%s\n",str);
}
(*env)->ReleaseStringUTFChars(env, StringBuf, str);
}
ReadString2.class by
javac ReadString2.java
ReadString2.so文件由
cc -I"/usr/lib/jvm/java/include/" -I"/usr/lib/jvm/java/include/linux/" ReadString2.c -o libReadString2.so -shared
和运行
java -Djava.library.path=. ReadString2
错误是:
Exception in thread "main" java.lang.UnsatisfiedLinkError: ReadString2.readS([Ljava/lang/String;)V
at ReadString2.readS(Native Method)
at ReadString2.main(ReadString2.java:19)
那么,我的代码怎么了?
我还有一个问题,如果任何项为null,我如何抛出NullPointerException???
ReadString2.dll
或ReadString2.dll。因此无法找到。
在Windows下,您可以将dll放在“当前”目录中,或者更一般地说,您应该使用-Djava.library.path=…
在您的代码中,您必须使用以下内容释放资源:
void ReleaseStringChars(JNIEnv *env, jstring string, const jchar *chars);
请注意
javah -jni ReadString2
不生成ReadString2.so
,而只生成ReadString2.h
在Linux下,我不知道为什么,export LD\u LIBRARY\u PATH=…
也是必需的。最后我发现了我代码的问题。这是我的错误,抱歉,伙计们。
我用过:
而不是
Java_ReadString2_readS(JNIEnv *env,jobject obj, jobjectArray StringBuf)"{}
ReadS->ReadS@谢谢您的回复,我已经按照您所说的做了,但根本不起作用。我使用Linux system.Building ReadString2.So文件,由javah-jni ReadString2和java-Djava.library.path=.ReadString2运行。
Java_ReadString2_ReadS(JNIEnv *env,jobject obj, jobjectArray StringBuf)"{}
Java_ReadString2_readS(JNIEnv *env,jobject obj, jobjectArray StringBuf)"{}