CAResult_t CAEDRCreateJNIInterfaceObject(jobject context) { JNIEnv* env; OIC_LOG(DEBUG, TAG, "CAEDRCreateJNIInterfaceObject"); if ((*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6) != JNI_OK) { OIC_LOG(ERROR, TAG, "Could not get JNIEnv pointer"); return CA_STATUS_FAILED; } jmethodID mid_getApplicationContext = CAGetJNIMethodID(env, CLASSPATH_CONTEXT, "getApplicationContext", METHODID_CONTEXTNONPARAM); if (!mid_getApplicationContext) { OIC_LOG(ERROR, TAG, "Could not get getApplicationContext method"); return CA_STATUS_FAILED; } jobject jApplicationContext = (*env)->CallObjectMethod(env, context, mid_getApplicationContext); if (!jApplicationContext) { OIC_LOG(ERROR, TAG, "Could not get application context"); return CA_STATUS_FAILED; } //Create EDRJniInterface instance jclass EDRJniInterface = (*env)->FindClass(env, CLASSPATH_BT_INTERFACE); if (!EDRJniInterface) { OIC_LOG(ERROR, TAG, "Could not get CaEdrInterface class"); return CA_STATUS_FAILED; } jmethodID EDRInterfaceConstructorMethod = (*env)->GetMethodID(env, EDRJniInterface, "<init>", "(Landroid/content/Context;)V"); if (!EDRInterfaceConstructorMethod) { OIC_LOG(ERROR, TAG, "Could not get CaEdrInterface constructor method"); return CA_STATUS_FAILED; } (*env)->NewObject(env, EDRJniInterface, EDRInterfaceConstructorMethod, jApplicationContext); OIC_LOG(DEBUG, TAG, "NewObject Success"); return CA_STATUS_OK; }
CAResult_t CAIPJniInit() { OIC_LOG(DEBUG, TAG, "CAIPJniInit_IN"); JavaVM *jvm = CANativeJNIGetJavaVM(); if (!jvm) { OIC_LOG(ERROR, TAG, "Could not get JavaVM pointer"); return CA_STATUS_FAILED; } jobject context = CANativeJNIGetContext(); if (!context) { OIC_LOG(ERROR, TAG, "unable to get application context"); return CA_STATUS_FAILED; } JNIEnv* env; if ((*jvm)->GetEnv(jvm, (void**) &env, JNI_VERSION_1_6) != JNI_OK) { OIC_LOG(ERROR, TAG, "Could not get JNIEnv pointer"); return CA_STATUS_FAILED; } jmethodID mid_getApplicationContext = CAGetJNIMethodID(env, "android/content/Context", "getApplicationContext", "()Landroid/content/Context;"); if (!mid_getApplicationContext) { OIC_LOG(ERROR, TAG, "Could not get getApplicationContext method"); return CA_STATUS_FAILED; } jobject jApplicationContext = (*env)->CallObjectMethod(env, context, mid_getApplicationContext); if (!jApplicationContext) { OIC_LOG(ERROR, TAG, "Could not get application context"); return CA_STATUS_FAILED; } jclass cls_CaIpInterface = (*env)->FindClass(env, "org/iotivity/ca/CaIpInterface"); if (!cls_CaIpInterface) { OIC_LOG(ERROR, TAG, "Could not get CaIpInterface class"); return CA_STATUS_FAILED; } jmethodID mid_CaIpInterface_ctor = (*env)->GetMethodID(env, cls_CaIpInterface, "<init>", "(Landroid/content/Context;)V"); if (!mid_CaIpInterface_ctor) { OIC_LOG(ERROR, TAG, "Could not get CaIpInterface constructor method"); return CA_STATUS_FAILED; } (*env)->NewObject(env, cls_CaIpInterface, mid_CaIpInterface_ctor, jApplicationContext); OIC_LOG(DEBUG, TAG, "Create CaIpInterface instance, success"); OIC_LOG(DEBUG, TAG, "CAIPJniInit_OUT"); return CA_STATUS_OK; }
CAResult_t CAEDRNativeReadData(JNIEnv *env, uint32_t idx) { if ((*env)->ExceptionCheck(env)) { (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); OIC_LOG(ERROR, TAG, "env error!!"); return CA_STATUS_FAILED; } jobject jni_obj_inputStream = CAEDRNativeGetInputStream(idx); if (!jni_obj_inputStream) { OIC_LOG(ERROR, TAG, "jni_obj_inputStream is null"); return CA_STATUS_FAILED; } jmethodID jni_mid_available = CAGetJNIMethodID(env, "java/io/InputStream", "available", "()I"); if (!jni_mid_available) { OIC_LOG(ERROR, TAG, "jni_mid_available is null"); return CA_STATUS_FAILED; } jint available = (*env)->CallIntMethod(env, jni_obj_inputStream, jni_mid_available); if (0 < available) { jobject jni_obj_socket = CAEDRNativeGetDeviceSocket(idx); if (!jni_obj_socket) { OIC_LOG(ERROR, TAG, "jni_obj_socket is null"); return CA_STATUS_FAILED; } jstring jni_str_address = CAEDRNativeGetAddressFromDeviceSocket(env, jni_obj_socket); if (!jni_str_address) { OIC_LOG(ERROR, TAG, "jni_str_address is null"); return CA_STATUS_FAILED; } const char* address = (*env)->GetStringUTFChars(env, jni_str_address, NULL); if (!address) { OIC_LOG(ERROR, TAG, "address is null"); (*env)->DeleteLocalRef(env, jni_str_address); return CA_STATUS_FAILED; } CAConnectedDeviceInfo_t *deviceInfo = (CAConnectedDeviceInfo_t *) CAEDRGetDeviceInfoFromAddress(address); if (!deviceInfo) { OIC_LOG(ERROR, TAG, "failed to get device info from list"); (*env)->ReleaseStringUTFChars(env, jni_str_address, address); (*env)->DeleteLocalRef(env, jni_str_address); return CA_STATUS_FAILED; } jint bufSize = (deviceInfo->totalDataLen == 0) ? EDR_MAX_HEADER_LEN : deviceInfo->totalDataLen; if (!deviceInfo->recvData) { deviceInfo->recvData = OICCalloc(1, bufSize); if (!deviceInfo->recvData) { OIC_LOG(ERROR, TAG, "out of memory"); (*env)->ReleaseStringUTFChars(env, jni_str_address, address); (*env)->DeleteLocalRef(env, jni_str_address); return CA_STATUS_FAILED; } } jint remainSize = (jint) bufSize - deviceInfo->recvDataLen; if (0 >= remainSize) { OIC_LOG(ERROR, TAG, "remainSize value is invalid."); (*env)->ReleaseStringUTFChars(env, jni_str_address, address); (*env)->DeleteLocalRef(env, jni_str_address); return CA_STATUS_FAILED; } jbyteArray jbuf = (*env)->NewByteArray(env, remainSize); if (!jbuf) { OIC_LOG(ERROR, TAG, "jbuf is null"); (*env)->ReleaseStringUTFChars(env, jni_str_address, address); (*env)->DeleteLocalRef(env, jni_str_address); return CA_STATUS_FAILED; } jmethodID jni_mid_read = CAGetJNIMethodID(env, "java/io/InputStream", "read", "([BII)I"); if (!jni_mid_read) { OIC_LOG(ERROR, TAG, "jni_mid_read is null"); (*env)->DeleteLocalRef(env, jbuf); (*env)->ReleaseStringUTFChars(env, jni_str_address, address); (*env)->DeleteLocalRef(env, jni_str_address); return CA_STATUS_FAILED; } OIC_LOG_V(DEBUG, TAG, "read InputStream (idx:%d, addr:%s)", idx, address); jint recvLen = (*env)->CallIntMethod(env, jni_obj_inputStream, jni_mid_read, jbuf, (jint) 0, remainSize); if (-1 == recvLen) { OIC_LOG(ERROR, TAG, "recvLen is -1"); (*env)->DeleteLocalRef(env, jbuf); (*env)->ReleaseStringUTFChars(env, jni_str_address, address); (*env)->DeleteLocalRef(env, jni_str_address); return CA_STATUS_FAILED; } OIC_LOG_V(DEBUG, TAG, "read success (length: %d bytes)", recvLen); jbyte* buf = (*env)->GetByteArrayElements(env, jbuf, NULL); if (!buf) { OIC_LOG(ERROR, TAG, "buf is null"); (*env)->DeleteLocalRef(env, jbuf); (*env)->ReleaseStringUTFChars(env, jni_str_address, address); (*env)->DeleteLocalRef(env, jni_str_address); return CA_STATUS_FAILED; } memcpy(deviceInfo->recvData + deviceInfo->recvDataLen, (const char*) buf, recvLen); deviceInfo->recvDataLen += recvLen; (*env)->ReleaseByteArrayElements(env, jbuf, buf, 0); (*env)->DeleteLocalRef(env, jbuf); if (!deviceInfo->totalDataLen && deviceInfo->recvData) { coap_transport_t transport = coap_get_tcp_header_type_from_initbyte( ((unsigned char *) deviceInfo->recvData)[0] >> 4); size_t headerLen = coap_get_tcp_header_length_for_transport(transport); if (deviceInfo->recvDataLen >= headerLen) { deviceInfo->totalDataLen = coap_get_total_message_length(deviceInfo->recvData, deviceInfo->recvDataLen); OIC_LOG_V(DEBUG, TAG, "total data length [%d] bytes", deviceInfo->totalDataLen); uint8_t *newBuf = OICRealloc(deviceInfo->recvData, deviceInfo->totalDataLen); if (!newBuf) { OIC_LOG(ERROR, TAG, "out of memory"); (*env)->ReleaseStringUTFChars(env, jni_str_address, address); (*env)->DeleteLocalRef(env, jni_str_address); return CA_STATUS_FAILED; } deviceInfo->recvData = newBuf; } }