AnsweredAssumed Answered

System App Jni call to Java Fail

Question asked by jesse stone on Sep 11, 2017
Latest reply on Sep 11, 2017 by jesse stone


static JavaVM*            s_javavm             = NULL;
static jclass                 s_javaclass             = NULL;
static    volatile int     s_thread_work     = 0;
static    volatile int     s_loop_status         = 0;

 

extern "C"
{
    JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
    {
        jclass         cls;
        JNIEnv*     env = NULL;

 

        if (vm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK)
        {
            __android_log_write(ANDROID_LOG_ERROR, "sllin", "OnLoad error");
            return JNI_ERR;
        }

 

        s_javavm = vm; //save to use this for the rest of the app.

 

        return JNI_VERSION_1_6;
    }

 

    JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved)
    {
        JNIEnv* env = NULL;

 

        if (vm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK)
        {
            __android_log_write(ANDROID_LOG_ERROR, "sllin", "OnUnload error");
            return;
        }

 

        s_javavm = NULL;
    }
}

 

static JNIEnv* GetJavaVmEnv()
{
    JNIEnv* env;

 

    if( s_javavm )
    {
        if( s_javavm->GetEnv((void **)&env, JNI_VERSION_1_6) != JNI_OK )
        {
            __android_log_write(ANDROID_LOG_ERROR, "sllin", "GetJavaVmEnv error");
            env = NULL;
        }
    }

 

    return env;
}

 

void Interface_InitJniClass(JNIEnv* env, jobject obj)
{
    jclass         cls;
    JNIEnv*     jvmenv = GetJavaVmEnv();

 

    if( s_javaclass == NULL )
    {
        cls                = jvmenv->FindClass("com/android/linbusconfig/LinbusConfig");
        //cls                = jvmenv->FindClass("com/android/linbusconfig/ReceiveAPI");
        s_javaclass     = (jclass)jvmenv->NewGlobalRef(cls);
        jvmenv->DeleteLocalRef(cls);
    }
}

 

void Interface_ReleaseJniClass(JNIEnv* env, jobject obj)
{
    JNIEnv*     vmenv = GetJavaVmEnv();

 

    if( s_javaclass )
    {
        vmenv->DeleteGlobalRef(s_javaclass);
        s_javaclass = NULL;
    }
}


void Interface_ReceiveData(int can_id, unsigned char can_dlc, unsigned char* data)
{
    jint                 ret;
    jmethodID    mid;
    jbyteArray    jbarray;
    int                length    = sizeof( ((struct can_frame *)0)->data );
    JNIEnv*         jvmenv    = GetJavaVmEnv();

 

    mid = jvmenv->GetStaticMethodID(s_javaclass, "ReceiveLinStatic", "(IB[B)I"); //int byte bytearray
    //mid = jvmenv->GetMethodID(s_javaclass, "ReceiveLinDynamic", "(IB[B)V");

 

    if( mid )
    {
        jbarray = jvmenv->NewByteArray( length );

 

        jvmenv->SetByteArrayRegion(jbarray, 0, length, (jbyte*)data);

 

        ret = jvmenv->CallStaticIntMethod(s_javaclass, mid, can_id, can_dlc, jbarray);
        //jvmenv->CallVoidMethod(s_javaclass, mid, can_id, can_dlc, jbarray);

 

        jvmenv->DeleteLocalRef(jbarray);
    }
}

///

JNIEXPORT void JNICALL  Java_com_android_linbusconfig_LinbusConfig_nativeInitJniClass(JNIEnv* env, jobject obj)
{
    Interface_InitJniClass(env, obj);
}

 

JNIEXPORT void JNICALL  Java_com_android_linbusconfig_LinbusConfig_nativeReleaseJniClass(JNIEnv* env, jobject obj)
{
    Interface_ReleaseJniClass(env, obj);
}

////

public class LinbusConfig extends Activity
{

    public static int ReceiveLinStatic(int can_id, byte can_dlc, byte[] data)
    {
        return can_id;
    }

 

     @Override
    public void onCreate(Bundle savedInstanceState)
    {
        System.loadLibrary("linattach");

 

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        nativeInitJniClass();

    }

}

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

mid = jvmenv->GetStaticMethodID(s_javaclass, "ReceiveLinStatic", "(IB[B)I"); //int byte bytearray

in system app the mid always return 0x00

but use install apk mid is good id

Outcomes