1. 环境 VMware + Ubuntu + Eclipse
开启vmware下的串口, 启动模拟器,将模拟器串口重定向到ubuntu ttyS0
2.
java调用native:
*.java内:
initJNIEnv();
public native int initJNIEnv();
public native void openSerial();
static {
System.loadLibrary("serialjni");
}
*.c内:
jintJava_com_test_serialjni_SerialjniActivity_initJNIEnv(JNIEnv* env, jobject obj)
{
gObject= (*env)->NewGlobalRef(env, obj);
(*env)->DeleteLocalRef(env,obj);
return 0;
}
Android.mk内:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := serialjni
LOCAL_SRC_FILES := test.c
include $(BUILD_SHARED_LIBRARY)
Native callback java:
*.c内:
Void callback_notifyjava()
{
JNIEnv*env = NULL;
jint isAttached = 0;
switch ((*gJavaVM)->GetEnv(gJavaVM, (void**)&env,JNI_VERSION_1_4))
{
case JNI_OK:
LOGD("GetEnv JNI_OK");
break;
case JNI_EDETACHED:
if((*gJavaVM)->AttachCurrentThread(gJavaVM, (void**)&env, NULL)!=0)
{
}
LOGD("GetEnv JNI_EDETACHED");
isAttached = 1;
break;
case JNI_EVERSION:
LOGD("GetEnv JNI_EVERSION");
break;
}
jclass cls = (*env)->GetObjectClass(env, gObject);
jmethodID mid = (*env)->GetMethodID(env, cls,"getdatafromnative", "([CI)V");
jcharArray jchar_array =(*env)->NewCharArray(env, length);
if (jchar_array == NULL) {
return;
}
(*env)->SetCharArrayRegion(env, jchar_array, 0, length, (constjchar*)buf);
(*env)->CallVoidMethod(env, gObject, mid, jchar_array, length);
if(isAttached)
(*gJavaVM)->DetachCurrentThread(gJavaVM);
}