Конечно, код не идентичен другим, он очень похож и не может пройти вызов NewObject.Есть несколько других выполняемых вызовов, которые, как я ожидал, потерпели неудачу до вызова NewObject.
Вот мой объект Stuff, который используется для создания массива.
public class Stuff implements java.io.Serializable, Cloneable
{
private String field1;
private String field2;
public Stuff() { }
public Stuff(String s1, String s2)
{
this.field1 = s1;
this.field2 = s2;
}
public String getField1() { return field1; }
public String getField2() { return field2; }
public void setField1(String s1) { this.field1 = s1; }
public void setField2(String s2) { this.field2 = s2; }
}
Код JavaJNITest.java очень минимален.
public class JavaJNITest
{
static
{
System.loadLibrary("myLib");
}
private native Stuff[] getStuffArray();
// Test Driver
public static void main(String[] args)
{
new JavaJNITest().getStuffArray();
}
}
Вот файл cCodeForLIbrary.c
#include <jni.h>
#include <stdio.h>
#include <string.h>
#include "JavaJNITest.h"
typedef struct javaStuff_st
{
jclass class;
jmethodID constructor;
jfieldID field1; /*jstring*/
jfieldID field2; /*jstring*/
}javaStuff;
javaStuff javaStuff_s;
JNIEXPORT jobjectArray JNICALL Java_JavaJNITest_getStuffArray (JNIEnv *env, jobject obj)
{
jobjectArray retVal=NULL;
jobject obj1;
jclass javaStuffClass;
printf("Inside JNI LIbrary\n");
printf("Finding class\n");
javaStuffClass=(*env)->FindClass(env, "Stuff");
if (javaStuffClass == NULL)
printf("Class NOT found\n");
else
printf("Class FOUND \n");
printf("Creating Global Ref\n");
javaStuff_s.class=(*env)->NewGlobalRef(env, javaStuffClass);
printf("Creating JavaObjectArray\n");
retVal=(*env)->NewObjectArray(env,
(jsize)10,
javaStuff_s.class, NULL);
if (retVal == NULL)
printf("Array NOT created\n");
else
printf("Array CREATED \n");
printf("Creating single Object\n" );
obj1 =(*env)->NewObject(env,
javaStuff_s.class,
javaStuff_s.constructor);
if (obj1 == NULL)
printf("Object NOT created\n");
else
printf("Object CREATED \n");
printf("Done!!!\n");
return retVal;
}
Вот команды построения:
rm -f *.class *.so *.o
javac Stuff.java
javac JavaJNITest.java
javac -h . JavaJNITest.java
gcc -fPIC -shared -I$JAVA_HOME/include -I$JAVA_HOME/include/linux cCodeForLIbrary.c -o libmyLib.so
При выполнении, вот вывод:
> java -classpath . -Djava.library.path=. JavaJNITest
Inside JNI LIbrary
Finding class
Class FOUND
Creating Global Ref
Creating JavaObjectArray
Array CREATED
Creating single Object
Он падает на «NewObject», но «NewObjectArray» успешен.
Код на самом деле не сильно отличается от других, но, очевидно, что-то вызывает его неудачу.Есть идеи?