Я не знаю, как правильно отобразить это.
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);
}