System App Jni call to Java Fail

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

System App Jni call to Java Fail

Jump to solution
657 Views
fatalfeel
Contributor V


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

Labels (1)
1 Solution
522 Views
fatalfeel
Contributor V

I got answer

in Android.mk       LOCAL_PROGUARD_ENABLED -> need disable

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := LinbusConfig
LOCAL_MODULE_TAGS := optional
LOCAL_PRELINK_MODULE := false
LOCAL_PROGUARD_ENABLED := disabled           //////////////////////////please add this line!!!
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_SDK_VERSION := current
LOCAL_CERTIFICATE := platform
LOCAL_JNI_SHARED_LIBRARIES := liblinattach

include $(call all-makefiles-under,$(LOCAL_PATH))

View solution in original post

1 Reply
523 Views
fatalfeel
Contributor V

I got answer

in Android.mk       LOCAL_PROGUARD_ENABLED -> need disable

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := LinbusConfig
LOCAL_MODULE_TAGS := optional
LOCAL_PRELINK_MODULE := false
LOCAL_PROGUARD_ENABLED := disabled           //////////////////////////please add this line!!!
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_SDK_VERSION := current
LOCAL_CERTIFICATE := platform
LOCAL_JNI_SHARED_LIBRARIES := liblinattach

include $(call all-makefiles-under,$(LOCAL_PATH))