我有以下 Java 代码:
import java.io.IOException;
public class Simple {
public native void initClient(byte[] buffer, int size);
static {
System.loadLibrary("simpleclient");
}
public static void main(String[] args) throws Exception {
Simple client = new Simple();
byte[] buffer = "test".getBytes();
client.initClient(buffer, buffer.length);
}
}
以及以下 C 代码:
#include <jni.h>
#include <stdio.h>
JNIEXPORT void JNICALL Java_Simple_initClient
(JNIEnv *env, jobject jobj, jbyteArray jBuffer, int size)
{
unsigned char *buffer = (unsigned char*)malloc(sizeof(unsigned char) * size);
if(buffer == NULL || jBuffer == NULL) return;
(*env)->GetByteArrayRegion(env, jBuffer, 0, size,(jbyte*) buffer );
FILE * metaFile = NULL;
metaFile = fmemopen(buffer, size, "rb");
if(metaFile == NULL) return;
printf("int _flags %d\n", metaFile->_flags);
}
我编译这个使用:
gcc -o libsimpleclient.so -shared -fPIC simpleclient.c
javac Simple.java
java -Djava.library.path=. -cp . Simple
这会在 C 中的 printf 调用中使用 SIGSEGV 崩溃 - 有时会崩溃。
我检查了缓冲区在崩溃和不崩溃时都有有效数据。