How to use JNI to call JAVA method from C

1.9k Views Asked by At

I want to use JNI (Java Native Interface) to call a specific java setter method, passing a short[] buffer into it as a parameter.

Java method implimentation looks as follows:

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

From inside my C function how can I call this method using JNI.

My code currently looks like this:

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");
        }  
    } 
}

When I run this, the setLeftDataID is allays NULL.

Note that the jobj parameter is my object being passed in that contains the setPcmLeft implementation.

2

There are 2 best solutions below

2
On BEST ANSWER

In the call to GetMethodID(), the method name does not need angle brackets, and the signature needs to match the Java method.

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

In general, the signature is of the form ( arg-types ) ret-type, encoded as specified in the link below. The argument is a short[], encoded as [S. The return type is V for void.

More information is available in Chapter 3 of the Oracle JNI guide.

4
On

Try this:

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