LOCAL_PATH := $(call my-dir)\r
TARGET_ARCH_ABI := $(APP_ABI)\r
-SECURED := $(SECURE)
+SECURED := $(SECURE)\r
\r
include $(CLEAR_VARS)\r
OIC_LIB_PATH := ../../../../out/android/$(APP_ABI)/$(APP_OPTIM)\r
LOCAL_SRC_FILES := $(OIC_LIB_PATH)/libconnectivity_abstraction.so\r
include $(PREBUILT_SHARED_LIBRARY)\r
\r
-ifeq ($(SECURED), 1)
-include $(CLEAR_VARS)
-OIC_LIB_PATH := ../../../../out/android/$(APP_ABI)/$(APP_OPTIM)
-LOCAL_MODULE := libandroid-ocprovision
-LOCAL_SRC_FILES := $(OIC_LIB_PATH)/libocprovision.a
-include $(PREBUILT_STATIC_LIBRARY)
-
-include $(CLEAR_VARS)
-OIC_LIB_PATH := ../../../../out/android/$(APP_ABI)/$(APP_OPTIM)
-LOCAL_MODULE := libandroid-ocpmapi
-LOCAL_SRC_FILES := $(OIC_LIB_PATH)/libocpmapi.a
-include $(PREBUILT_STATIC_LIBRARY)
-endif
-
+ifeq ($(SECURED), 1)\r
+include $(CLEAR_VARS)\r
+OIC_LIB_PATH := ../../../../out/android/$(APP_ABI)/$(APP_OPTIM)\r
+LOCAL_MODULE := libandroid-ocprovision\r
+LOCAL_SRC_FILES := $(OIC_LIB_PATH)/libocprovision.a\r
+include $(PREBUILT_STATIC_LIBRARY)\r
+\r
+include $(CLEAR_VARS)\r
+OIC_LIB_PATH := ../../../../out/android/$(APP_ABI)/$(APP_OPTIM)\r
+LOCAL_MODULE := libandroid-ocpmapi\r
+LOCAL_SRC_FILES := $(OIC_LIB_PATH)/libocpmapi.a\r
+include $(PREBUILT_STATIC_LIBRARY)\r
+endif\r
+\r
include $(CLEAR_VARS)\r
OIC_SRC_PATH := ../../../resource\r
LOCAL_MODULE := libca-interface\r
JniOcResourceResponse.cpp \\r
JniOcPlatform.cpp \\r
JniOcResource.cpp \\r
- JniOcResourceIdentifier.cpp \
- JniOcSecurity.cpp
-ifeq ($(SECURED), 1)
-LOCAL_SRC_FILES += JniOcSecureResource.cpp \
- JniOcProvisioning.cpp \
- JniSecureUtils.cpp \
- JniProvisionResultListner.cpp \
- JniPinCheckListener.cpp \
- JniDisplayPinListener.cpp
-endif
+ JniOcResourceIdentifier.cpp \\r
+ JniOcSecurity.cpp\r
+ifeq ($(SECURED), 1)\r
+LOCAL_SRC_FILES += JniOcSecureResource.cpp \\r
+ JniOcProvisioning.cpp \\r
+ JniSecureUtils.cpp \\r
+ JniProvisionResultListner.cpp \\r
+ JniPinCheckListener.cpp \\r
+ JniDisplayPinListener.cpp\r
+endif\r
\r
LOCAL_LDLIBS := -llog\r
LOCAL_STATIC_LIBRARIES := android-oc\r
LOCAL_STATIC_LIBRARIES += android-oc_logger\r
LOCAL_STATIC_LIBRARIES += android-ca\r
LOCAL_STATIC_LIBRARIES += android_cpp11_compat\r
-ifeq ($(SECURED), 1)
-LOCAL_STATIC_LIBRARIES += android-ocprovision
-LOCAL_STATIC_LIBRARIES += android-ocpmapi
-endif
+ifeq ($(SECURED), 1)\r
+LOCAL_STATIC_LIBRARIES += android-ocprovision\r
+LOCAL_STATIC_LIBRARIES += android-ocpmapi\r
+endif\r
\r
LOCAL_CPPFLAGS += -std=c++0x\r
LOCAL_CPP_FEATURES := rtti exceptions\r
LOCAL_C_INCLUDES := $(OIC_SRC_PATH)/include\r
LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/c_common\r
-LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/c_common/oic_string/include
-LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/c_common/oic_malloc/include
+LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/c_common/oic_string/include\r
+LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/c_common/oic_malloc/include\r
LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/stack/include\r
LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/ocsocket/include\r
LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/oc_logger/include\r
LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/../extlibs/boost/boost_1_58_0\r
LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/../build_common/android/compatibility\r
-LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/security/provisioning/include
-LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/security/provisioning/include/oxm/
-LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/security/provisioning/include/internal
-LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/security/include
+LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/security/provisioning/include\r
+LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/security/provisioning/include/oxm/\r
+LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/security/provisioning/include/internal\r
+LOCAL_C_INCLUDES += $(OIC_SRC_PATH)/csdk/security/include\r
include $(BUILD_SHARED_LIBRARY)\r
#include <stdio.h>
#include "cainterface.h"
#include "JniCaInterface.h"
+#include "cautilinterface.h"
+#include "cacommon.h"
#define LOG_TAG "JNI_CA_INTERFACE"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
+static jobject g_listenerObject = NULL;
+static JavaVM *g_jvm = NULL;
+
JNIEXPORT jint JNI_OnLoad(JavaVM *jvm, void *reserved)
{
LOGI("CaInterface_initialize");
+ g_jvm = jvm;
CANativeJNISetJavaVM(jvm);
return JNI_VERSION_1_6;
CANativeSetActivity(env, activity);
CANativeJNISetContext(env, context);
-}
\ No newline at end of file
+}
+
+void CAManagerConnectionStateChangedCB(CATransportAdapter_t adapter,
+ const char *remote_address,
+ bool connected)
+{
+ LOGI("Callback - CAManagerConnectionStateChangedCB : type(%d), address(%s), connected(%d)",
+ adapter, remote_address, connected);
+
+ if (!g_listenerObject)
+ {
+ LOGE("g_listener is NULL, cannot have callback");
+ return;
+ }
+
+ bool isAttached = false;
+ JNIEnv* env;
+ jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
+ if (JNI_OK != res)
+ {
+ LOGI("AttachCurrentThread will be called for JNIEnv pointer");
+ res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
+
+ if (JNI_OK != res)
+ {
+ LOGE("AttachCurrentThread has failed");
+ return;
+ }
+ isAttached = true;
+ }
+
+ jclass jni_cls_listener = (*env)->GetObjectClass(env, g_listenerObject);
+ if (!jni_cls_listener)
+ {
+ LOGE("could not get jni_cls_listener");
+ goto exit_error;
+ }
+
+ jmethodID jni_mid_listener = (*env)->GetMethodID(env, jni_cls_listener,
+ "onConnectionStateChanged",
+ "(Lorg/iotivity/base/OcConnectivityType;"
+ "Ljava/lang/String;Z)V");
+ if (!jni_mid_listener)
+ {
+ LOGE("could not get Method ID");
+ goto exit_error;
+ }
+
+ jstring jni_address = (*env)->NewStringUTF(env, remote_address);
+ if (!jni_address)
+ {
+ LOGE("jni_address is null");
+ goto exit_error;
+ }
+
+ jclass jni_cls_enum = (*env)->FindClass(env, "org/iotivity/base/OcConnectivityType");
+ if (!jni_cls_enum)
+ {
+ LOGE("could not get jni_cls_enum");
+ goto exit_error;
+ }
+
+ jmethodID jni_mid_enum = (*env)->GetStaticMethodID(env, jni_cls_enum, "getInstance",
+ "(I)Lorg/iotivity/base/OcConnectivityType;");
+ if (!jni_mid_enum)
+ {
+ LOGE("could not get Method ID (getInstance)");
+ goto exit_error;
+ }
+
+ jobject jni_adaptertype = (*env)->CallStaticObjectMethod(env, jni_cls_enum,
+ jni_mid_enum, adapter);
+ (*env)->CallVoidMethod(env, g_listenerObject, jni_mid_listener,
+ jni_adaptertype, jni_address,
+ (jboolean)connected);
+
+exit_error:
+ if (isAttached)
+ {
+ (*g_jvm)->DetachCurrentThread(g_jvm);
+ }
+
+ LOGI("OUT - CAManagerConnectionStateChangedCB");
+}
+
+void CAManagerAdapterStateChangedCB(CATransportAdapter_t adapter, bool enabled)
+{
+ LOGI("Callback - CAManagerAdapterStateChangedCB : type(%d), enabled(%d)",
+ adapter, enabled);
+
+ if (!g_listenerObject)
+ {
+ LOGE("g_listener is NULL, cannot have callback");
+ return;
+ }
+
+ bool isAttached = false;
+ JNIEnv* env;
+ jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
+ if (JNI_OK != res)
+ {
+ LOGI("AttachCurrentThread will be called for JNIEnv pointer");
+ res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
+
+ if (JNI_OK != res)
+ {
+ LOGE("AttachCurrentThread has failed");
+ return;
+ }
+ isAttached = true;
+ }
+
+ jclass jni_cls_listener = (*env)->GetObjectClass(env, g_listenerObject);
+ if (!jni_cls_listener)
+ {
+ LOGE("could not get jni_cls_listener");
+ goto exit_error;
+ }
+
+ jmethodID jni_mid_listener = (*env)->GetMethodID(env, jni_cls_listener,
+ "onAdapterStateChanged",
+ "(Lorg/iotivity/base/OcConnectivityType;Z)V");
+ if (!jni_mid_listener)
+ {
+ LOGE("could not get Method ID");
+ goto exit_error;
+ }
+
+ jclass jni_cls_enum = (*env)->FindClass(env, "org/iotivity/base/OcConnectivityType");
+ if (!jni_cls_enum)
+ {
+ LOGE("could not get jni_cls_enum");
+ goto exit_error;
+ }
+
+ jmethodID jni_mid_enum = (*env)->GetStaticMethodID(env, jni_cls_enum, "getInstance",
+ "(I)Lorg/iotivity/base/OcConnectivityType;");
+ if (!jni_mid_enum)
+ {
+ LOGE("could not get Method ID (getInstance)");
+ goto exit_error;
+ }
+
+ jobject jni_adaptertype = (*env)->CallStaticObjectMethod(env, jni_cls_enum,
+ jni_mid_enum, adapter);
+
+ (*env)->CallVoidMethod(env, g_listenerObject, jni_mid_listener,
+ jni_adaptertype, (jboolean)enabled);
+
+exit_error:
+ if (isAttached)
+ {
+ (*g_jvm)->DetachCurrentThread(g_jvm);
+ }
+ LOGI("OUT - CAManagerAdapterStateChangedCB");
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_caManagerInitialize(JNIEnv *env, jclass clazz,
+ jobject context, jobject listener)
+{
+ LOGI("CaManagere_initialize");
+
+ g_listenerObject = (*env)->NewGlobalRef(env, listener);
+
+ CARegisterNetworkMonitorHandler(CAManagerAdapterStateChangedCB,
+ CAManagerConnectionStateChangedCB);
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_caManagerTerminate(JNIEnv *env, jclass clazz)
+{
+ LOGI("CaManager_terminate");
+
+ CAUtilClientTerminate(env);
+
+ if (g_listenerObject)
+ {
+ (*env)->DeleteGlobalRef(env, g_listenerObject);
+ }
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_caManagerSetAutoConnectionDeviceInfo(JNIEnv *env,
+ jclass clazz,
+ jstring jaddress)
+{
+ LOGI("CaManager_setAutoConnectionDeviceInfo");
+
+ const char* address = (*env)->GetStringUTFChars(env, jaddress, NULL);
+ if (!address)
+ {
+ LOGE("address is null");
+ return;
+ }
+
+ CASetAutoConnectionDeviceInfo(address);
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_caManagerUnsetAutoConnectionDeviceInfo(JNIEnv *env,
+ jclass clazz,
+ jstring jaddress)
+{
+ LOGI("CaManager_unsetAutoConnectionDeviceInfo");
+
+ const char* address = (*env)->GetStringUTFChars(env, jaddress, NULL);
+ if (!address)
+ {
+ LOGE("address is null");
+ return;
+ }
+
+ CAUnsetAutoConnectionDeviceInfo(address);
+}
#ifdef __cplusplus
extern "C" {
#endif
+
+ void CAManagerConnectionStateChangedCB(CATransportAdapter_t adapter,
+ const char *remote_address, bool connected);
+
+ void CAManagerAdapterStateChangedCB(CATransportAdapter_t adapter, bool enabled);
+
+ /*
+ * Class: Java_org_iotivity_ca_CaInterface_caManagerInitialize
+ * Method: caManagerInitialize
+ * Signature: (Landroid/content/Context;)V
+ */
+ JNIEXPORT void JNICALL
+ Java_org_iotivity_ca_CaInterface_caManagerInitialize(JNIEnv *env, jclass clazz,
+ jobject context, jobject listener);
+
+ /*
+ * Class: Java_org_iotivity_ca_CaInterface_caManagerTerminate
+ * Method: caManagerTerminate
+ * Signature: ()V
+ */
+ JNIEXPORT void JNICALL
+ Java_org_iotivity_ca_CaInterface_caManagerTerminate(JNIEnv *env, jclass clazz);
+
+ /*
+ * Class: Java_org_iotivity_ca_CaInterface_caManagerSetAutoConnectionDeviceInfo
+ * Method: caManagerSetAutoConnectionDeviceInfo
+ * Signature: (Ljava/lang/String;)V
+ */
+ JNIEXPORT void JNICALL
+ Java_org_iotivity_ca_CaInterface_caManagerSetAutoConnectionDeviceInfo(JNIEnv *env,
+ jclass clazz,
+ jstring jaddress);
+
+ /*
+ * Class: Java_org_iotivity_ca_CaInterface_caManagerUnsetAutoConnectionDeviceInfo
+ * Method: caManagerUnsetAutoConnectionDeviceInfo
+ * Signature: (Ljava/lang/String;)V
+ */
+ JNIEXPORT void JNICALL
+ Java_org_iotivity_ca_CaInterface_caManagerUnsetAutoConnectionDeviceInfo(JNIEnv *env,
+ jclass clazz,
+ jstring jaddress);
+
/*
* Class: org_iotivity_ca_CaInterface_Initialize
* Method: Initialize
#ifdef __cplusplus
}
#endif
-#endif
\ No newline at end of file
+#endif
return typeSet;
}
-}
+
+ public static OcConnectivityType getInstance(int caTransportAdapter) {
+ switch (caTransportAdapter) {
+ case (1 << 0):
+ return CT_ADAPTER_IP;
+ case (1 << 1):
+ return CT_ADAPTER_GATT_BTLE;
+ case (1 << 2):
+ return CT_ADAPTER_RFCOMM_BTEDR;
+ case (1 << 3):
+ return CT_ADAPTER_REMOTE_ACCESS;
+ case (1 << 4):
+ return CT_ADAPTER_TCP;
+ default:
+ return CT_DEFAULT;
+ }
+ }
+}
\ No newline at end of file
import android.content.Context;
import android.app.Activity;
+import org.iotivity.base.OcException;
+import org.iotivity.base.OcConnectivityType;
public class CaInterface {
static {
System.loadLibrary("connectivity_abstraction");
System.loadLibrary("ca-interface");
}
+ private static volatile boolean isConnectionManagerInitialized = false;
public static native void initialize(Activity activity, Context context);
+
+ /**
+ * Method start connection manager service.
+ * this method has to be called before other API call.
+ * @param context application context
+ * @param onConnectionManagerStateListener connection state callback listener
+ */
+ public synchronized static void startManagerService(Context context,
+ OnConnectionManagerStateListener onConnectionManagerStateListener) {
+ if (!isConnectionManagerInitialized) {
+ CaInterface.caManagerInitialize(context, onConnectionManagerStateListener);
+ isConnectionManagerInitialized = true;
+ }
+ }
+
+ /**
+ * Method stop connection manager service.
+ * this method must be called, when Application is destroied.
+ */
+ public synchronized static void stopManagerService() {
+ if (isConnectionManagerInitialized) {
+ CaInterface.caManagerTerminate();
+ isConnectionManagerInitialized = false;
+ }
+ }
+
+ /**
+ * Method set device information for Auto-Connection.
+ * this method has to be called before FindResource is called.
+ * @param address LE address of scanned bluetooth device.
+ */
+ public synchronized static void setAutoConnectionDevice(String address)
+ throws OcException {
+ CaInterface.initCheckForConnectionManager();
+ CaInterface.caManagerSetAutoConnectionDeviceInfo(address);
+ }
+
+ /**
+ * Method unset device information for Auto-Connection.
+ * @param address LE address of scanned bluetooth device.
+ */
+ public synchronized static void unsetAutoConnectionDevice(String address)
+ throws OcException {
+ CaInterface.initCheckForConnectionManager();
+ CaInterface.caManagerUnsetAutoConnectionDeviceInfo(address);
+ }
+
+ /**
+ * Interface for connection manager state listener.
+ * Event listeners are notified asynchronously.
+ */
+ public interface OnConnectionManagerStateListener {
+ public void onAdapterStateChanged(OcConnectivityType type, boolean enabled);
+ public void onConnectionStateChanged(OcConnectivityType type, String address,
+ boolean connected);
+ }
+
+ private static void initCheckForConnectionManager() {
+ if (!isConnectionManagerInitialized) {
+ throw new IllegalStateException("ConnectionManager must be started by making "
+ + "a call to CaInterface.startManagerService before any other API "
+ + "calls are permitted");
+ }
+ }
+
+ private static native void caManagerInitialize(Context context,
+ OnConnectionManagerStateListener onConnectionManagerStateListener);
+ private static native void caManagerTerminate();
+ private static native void caManagerSetAutoConnectionDeviceInfo(String address);
+ private static native void caManagerUnsetAutoConnectionDeviceInfo(String address);
}
\ No newline at end of file
#define CA_UTILS_INTERFACE_H_
#include "cacommon.h"
-
+#ifdef __ANDROID__
+#include "jni.h"
+#endif
#ifdef __cplusplus
extern "C"
{
CAResult_t CAUnsetAutoConnectionDeviceInfo(const char* address);
+#ifdef __ANDROID__
+/**
+ * initialize util client for android
+ * @param[in] env JNI interface pointer.
+ * @param[in] jvm invocation inferface for JAVA virtual machine.
+ * @param[in] context application context.
+ *
+ * @return ::CA_STATUS_OK or ::CA_STATUS_FAILED or ::CA_MEMORY_ALLOC_FAILED
+ */
+CAResult_t CAUtilClientInitialize(JNIEnv *env, JavaVM *jvm, jobject context);
+
+/**
+ * terminate util client for android
+ * @param[in] env JNI interface pointer.
+ *
+ * @return ::CA_STATUS_OK or ::CA_STATUS_FAILED or ::CA_MEMORY_ALLOC_FAILED
+ */
+CAResult_t CAUtilClientTerminate(JNIEnv *env);
+#endif
+
#ifdef __cplusplus
} /* extern "C" */
#endif
*/
void CAStopServerLEAdvertising();
+#ifdef __ANDROID__
+#ifdef LE_ADAPTER
+/**
+ * initialize client connection manager
+ * @param[in] env JNI interface pointer.
+ * @param[in] jvm invocation inferface for JAVA virtual machine.
+ * @param[in] context application context.
+ *
+ * @return ::CA_STATUS_OK or ::CA_STATUS_FAILED or ::CA_MEMORY_ALLOC_FAILED
+ */
+CAResult_t CAManagerLEClientInitialize(JNIEnv *env, JavaVM *jvm, jobject context);
+
+/**
+ * terminate client connection manager
+ * @param[in] env JNI interface pointer.
+ *
+ * @return ::CA_STATUS_OK or ::CA_STATUS_FAILED or ::CA_MEMORY_ALLOC_FAILED
+ */
+CAResult_t CAManagerLEClientTerminate(JNIEnv *env);
+#endif
+#endif
+
#ifdef __cplusplus
} /* extern "C" */
#endif
return CA_NOT_SUPPORTED;
#endif
}
+
+#ifdef __ANDROID__
+/**
+ * initialize client connection manager
+ * @param[in] env JNI interface pointer.
+ * @param[in] jvm invocation inferface for JAVA virtual machine.
+ * @param[in] context application context.
+ */
+CAResult_t CAUtilClientInitialize(JNIEnv *env, JavaVM *jvm, jobject context)
+{
+ OIC_LOG(DEBUG, TAG, "CAUtilClientInitialize");
+#ifdef LE_ADAPTER
+
+#else
+ OIC_LOG(DEBUG, TAG, "it is not supported");
+ return CA_NOT_SUPPORTED;
+#endif
+
+ return CA_STATUS_OK;
+}
+
+/**
+ * terminate client connection manager
+ * @param[in] env JNI interface pointer.
+ */
+CAResult_t CAUtilClientTerminate(JNIEnv *env)
+{
+ OIC_LOG(DEBUG, TAG, "CAUtilClientTerminate");
+#ifdef LE_ADAPTER
+
+#else
+ OIC_LOG(DEBUG, TAG, "it is not supported");
+ return CA_NOT_SUPPORTED;
+#endif
+
+ return CA_STATUS_OK;
+}
+#endif