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
已解决! 转到解答。
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))
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))