Сбой Java JNI в NewObject.Другие звонки работают. - PullRequest
0 голосов
/ 20 октября 2018

Конечно, код не идентичен другим, он очень похож и не может пройти вызов 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» успешен.

Код на самом деле не сильно отличается от других, но, очевидно, что-то вызывает его неудачу.Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...