Как представить функцию пустого указателя в Android JNI? - PullRequest
0 голосов
/ 28 марта 2019

Я не знаю, как правильно отобразить это.

C метод

void* function(char* h, int p, void (*vrecv)(void* , uint8_t *, size_t ), 
               void* d, const char* n, uint8_t p8, uint16_t p16, uint32_t p32);

Метод JNI-оболочки

JNIEXPORT jstring JNICALL
Java_com_example_hellojni_HelloJni_function( JNIEnv* env, jobject thiz,
     blah-blah ) {
     return blah-blah;
}

Java-метод

public native void function();




Есть несколько примеров с доступ через массив Java, вызов метода CallVoidMethod или GetMethodId, но я их не понимаю. Трудно увидеть идею через java-метод, c / c ++ func и jni-метод.

Учебник по JNI API

Образцы Google Android NDK / JNI


Этот пример отлично работает:

Файл HelloJni.java.

JNIEXPORT jint JNICALL Java_com_example_hellojni_HelloJni_example(JNIEnv*env,
     jobject obj) {
     return (jint) example();
}

файл hello-jni.c.

void* run_thread(void* num) {
    int* temp = (int*) num;

    while(++(*temp) < 777);

    printf("Hello world! C Style! From pthread and Android NDK(JNI).\n");

    return NULL;
}

int example() {
    int f = 0;
    pthread_t pipe;

    if(pthread_create(&pipe, NULL, run_thread, &x)) {
        fprintf(stderr, "Error creating thread\n");
        return 1;
    }

    sleep(1);

    printf("before x: %d\n", x);

    /* wait for the second thread to finish */
    if(pthread_join(pipe, NULL)) {
        fprintf(stderr, "Error joining thread\n");
        return 2;
    }

    printf("after x: %d\n", x);

    return x;
}

Как получить доступ к структурам данных?

public native void example1(/**/);


Как вызвать элементы typedef struct?

Какой следующий шаг для указателя void * (правильное представление с длинной причиной 64 бита)?

public native void example2(long cl);
public native void example3(/**/);
public native void example4(/**/);


void* example1(char* h, int p, void (*vr)(void* , uint8_t *, size_t ), void* vdt,
void (*ar)(void* , uint8_t *, size_t ), void* adt);
void example2(void* cl);
void example3(void* cl, uint8_t is_p, uint8_t num, const char* name, uint8_t btype, uint8_t v, uint8_t prod, uint16_t opts);
void example4(void* cl, uint8_t num, uint16_t t, uint32_t c, uint32_t v);


JNIEXPORT void JNICALL Java_com_example_hellojni_HelloJni_example1 (JNIEnv* env, jobject obj, jchar* h, jint p, jlong vr, jlong vdt, jlong ar, jlong adt) {
    const char *str= (*env)->GetStringUTFChars(env,h,0);

    example1(str, p, vr, vdt, ar, adt);
}
JNIEXPORT void JNICALL Java_com_example_hellojni_HelloJni_example2 (JNIEnv* env, jobject obj, jlong cl) {
    example2(cl);
}
JNIEXPORT void JNICALL Java_com_example_hellojni_HelloJni_example3 (JNIEnv* env, jobject obj, jlong cl, uint8_t is_p, uint8_t num,
        jstring name, uint8_t btype, uint8_t v, uint8_t prod, uint16_t opts) {

    const char *str= (*env)->GetStringUTFChars(env,name,0);

    example3(cl, (jshort)is_p, num, str, (jshort)btype, (jshort)v, (jshort)prod, (jshort)opts);
}
JNIEXPORT void JNICALL Java_com_example_hellojni_HelloJni_example4 (JNIEnv* env, jobject obj, jlong cl, uint8_t num, uint16_t t, uint32_t c, uint32_t v) {
    example4(cl, (jshort)num, (jshort) t, (jlong)(unsigned long long) c, (jlong)(unsigned long long) v);
}
...