Как использовать JNI для вызова метода JAVA из C

Я хочу использовать JNI (собственный интерфейс Java) для вызова определенного метода установки Java, передавая короткий буфер [] в качестве параметра.

Реализация метода Java выглядит следующим образом:

public void setPcmLeft(short[] data) { pcm_l = data; }

Изнутри моей функции C, как я могу вызвать этот метод, используя JNI.

Мой код в настоящее время выглядит так:

void Java_com_companyName_lame_LameActivity_lameDecode(JNIEnv *env, jobject jobj)
{
    jclass class = (*env)->GetObjectClass(env, jobj);

    if (class != NULL) {

        jmethodID setLeftDatatID = (*env)->GetMethodID(env, class, "<setPcmLeft>", "void(V)");
        if (setLeftDatatID == NULL) {
            LOGD("(Lame) No method setLeftData");
        }  
    } 
}

Когда я запускаю это, setLeftDataID это успокаивает NULL,

Обратите внимание, что jobj параметр мой объект передается в котором содержится setPcmLeft реализация.

2 ответа

Решение

В призыве к GetMethodID()имя метода не нуждается в угловых скобках, а подпись должна соответствовать методу Java.

jmethodID setLeftDatatID = (*env)->GetMethodID(env, class, "setPcmLeft", "([S)V");

В общем, подпись имеет вид ( arg-types ) ret-typeзакодировано как указано в ссылке ниже. Аргумент короткий [], закодированный как [S, Тип возврата V для пустоты.

Более подробная информация доступна в главе 3 руководства Oracle JNI.

Попробуй это:

   jmethodID midCallBack = (*env)->GetMethodID(env, class, "setPcmLeft", "([S)V");
Другие вопросы по тегам