JNI różnice w liczbie argumentów pomiędzy Java a spodem w C

0

Witam,
Mam pytanie, dlaczego pomimo że metoda natywna jest jest zadeklarowana z jednym argumentem
to nagłówek wygenerował się z dwoma argumentami typu Object.

public class TestJni {

    public InnerClass c = new InnerClass();
   
    public TestJni() {
    }

    public void test() {
        c = testNat(c);
    }

    public native InnerClass testNat(InnerClass c);

    public class InnerClass {

        public byte[] digest = new byte[16];
        public long size;

        public InnerClass() {
        }
    }

/*
 * Class:     TestJni
 * Method:    testNat
 * Signature: (LTestJni/InnerClass;)LTestJni/InnerClass;
 */
JNIEXPORT jobject JNICALL Java_TestJni_testNat
  (JNIEnv *, jobject, jobject);
0

Bo jeden z parametrów dotyczy obiektu "this", a drugi tego "InnerClass".

0

Ok czyli nie rozwiało mi to mojego problemu bo nie chciałem się rozwodzić w szczegółach.
Zadeklarowaną mam identyczną klasę razem z wewnętrzną tylko różni się nazwą oraz jest parę dodatkowych metod i zmiennych i pomimo że nagłówek wygeneruje się też z dwoma argumentami typu jobject to drugi który ma wskazywać na klasę wewnętrzną zawsze jest 0 (NULL) i nie mogę się w C dostać do klasy wewnętrznej.

public class Md2 extends Hash {

    static {
        DIGEST_LENGTH = 16;
        BLOCK_LENGTH = 16;
        NAME = "md2";
        DIGEST0 = "8350E5A3E24C153DF2275C9F80692773";

        try {
            System.loadLibrary("testjni");
        } catch (UnsatisfiedLinkError e) {
            e.printStackTrace();
        }
    }

    public Md2Ctx ctx = new Md2Ctx();

    public Md2() {
        super();
    }

    public native Md2Ctx initContextNat(Md2Ctx ctx);

    public void initContext() {
        ctx = initContextNat(ctx);
    }

    public void doFinal() {
        digest = doFinalNat(ctx);
    }

    public void update(byte[] b, int offset, int len) {
        ctx = updateNat(ctx, b, offset, len);
    }

    private native Md2Ctx updateNat(Md2Ctx ctx, byte[] b, int offset, int len);

    private native byte[] doFinalNat(Md2Ctx ctx);

    public static class Md2Ctx {

        public byte[] x = new byte[48];
        public byte[] digest = new byte[16];
        public byte[] m = new byte[16];
        public byte[] c = new byte[16];
        public long size;

        public Md2Ctx() {
        }
    }
}



/*
 * Class:     Md2
 * Method:    initContextNat
 * Signature: (LMd2/Md2Ctx;LMd2/Md2Ctx;)LMd2/Md2Ctx;
 */
JNIEXPORT jobject JNICALL Java_Md2_initContextNat
  (JNIEnv *, jobject, jobject, jobject);

/*
 * Class:     Md2
 * Method:    updateNat
 * Signature: (LMd2/Md2Ctx;[BII)LMd2/Md2Ctx;
 */
JNIEXPORT jobject JNICALL Java_Md2_updateNat
  (JNIEnv *, jobject, jobject, jbyteArray, jint, jint);

/*
 * Class:     Md2
 * Method:    doFinalNat
 * Signature: (LMd2/Md2Ctx;)[B
 */
JNIEXPORT jbyteArray JNICALL Java_Md2_doFinalNat
  (JNIEnv *, jobject, jobject);
0

Tutaj masz inaczej bo wewnętrzna jest statyczna.
Dobierz się do niej bezpośrednio (jakoś tak: jclass c = env->FindClass("Md2$Md2Ctx");).

0
Delor napisał(a):

Tutaj masz inaczej bo wewnętrzna jest statyczna.
Dobierz się do niej bezpośrednio (jakoś tak: jclass c = env->FindClass("Md2$Md2Ctx");).

Modyfikator static to tylko moja wariacja bo już nie wiedziałem czego się czepić bez niego jest dalej bee :(

(JNIEnv *env, jobject obj1, jobject obj2) {
printf("obj1: %i, obj2: %i\n", obj1, obj2);

daje:

obj1: 102967168, obj2: 0

0

Temat zamknięty.
Problem powodowało że klasa Md2 było rozszerzeniem Hash, przeniosłem zmienne z pochodnej i JVM zaczęło zapodawać do obj2.

Dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1