From 0f64f847b25df1cdd66fd8dda36dd42c56d30469 Mon Sep 17 00:00:00 2001
From: Alexander Smorkalov <alexander.smorkalov@itseez.com>
Date: Tue, 4 Dec 2012 16:34:53 +0400
Subject: [PATCH] Info library loading implemeneted.

---
 .../jni/JNIWrapper/OpenCVLibraryInfo.cpp      | 93 ++++++++++++++++---
 .../org/opencv/engine/OpenCVLibraryInfo.java  |  2 +-
 2 files changed, 83 insertions(+), 12 deletions(-)

diff --git a/android/service/engine/jni/JNIWrapper/OpenCVLibraryInfo.cpp b/android/service/engine/jni/JNIWrapper/OpenCVLibraryInfo.cpp
index 9d9fdbf234..7a88907dbe 100644
--- a/android/service/engine/jni/JNIWrapper/OpenCVLibraryInfo.cpp
+++ b/android/service/engine/jni/JNIWrapper/OpenCVLibraryInfo.cpp
@@ -1,37 +1,108 @@
 #include "OpenCVLibraryInfo.h"
+#include "EngineCommon.h"
+#include <utils/Log.h>
+#include <dlfcn.h>
 
 JNIEXPORT jlong JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_open
-  (JNIEnv * env, jobject, jstring)
+  (JNIEnv * env, jobject, jstring str)
 {
-    return 255;
+    const char* infoLibPath = env->GetStringUTFChars(str, NULL);
+    if (infoLibPath == NULL)
+        return 0;
+
+    LOGD("Trying to load info library \"%s\"", infoLibPath);
+
+    void* handle;
+
+    handle = dlopen(infoLibPath, RTLD_LAZY);
+    if (handle == NULL)
+        LOGI("Info library not found by path \"%s\"", infoLibPath);
+
+    return (jlong)handle;
 }
 
 JNIEXPORT jstring JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_getPackageName
-  (JNIEnv* env, jobject, jlong)
+  (JNIEnv* env, jobject, jlong handle)
 {
-    return env->NewStringUTF("org.opencv.lib_v24_tegra3");
+    const char* (*info_func)();
+    const char* result;
+    const char* error;
+
+    dlerror();
+    *(void **) (&info_func) = dlsym((void*)handle, "GetPackageName");
+    if ((error = dlerror()) == NULL)
+        result = (*info_func)();
+    else
+    {
+        LOGE("dlsym error: \"%s\"", error);
+        result = "unknown";
+    }
+
+    return env->NewStringUTF(result);
 }
 
 JNIEXPORT jstring JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_getPublicName
 (JNIEnv* env, jobject, jlong)
 {
-    return env->NewStringUTF("OpenCV library for Tegra3");
+    const char* (*info_func)();
+    const char* result;
+    const char* error;
+
+    dlerror();
+    *(void **) (&info_func) = dlsym((void*)handle, "GetPublicName");
+    if ((error = dlerror()) == NULL)
+        result = (*info_func)();
+    else
+    {
+        LOGE("dlsym error: \"%s\"", error);
+        result = "unknown";
+    }
+
+    return env->NewStringUTF(result);
 }
 
 JNIEXPORT jstring JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_getLibraryList
-  (JNIEnv* env, jobject, jlong)
+  (JNIEnv* env, jobject, jlong handle)
 {
-    return env->NewStringUTF("");
+    const char* (*info_func)();
+    const char* result;
+    const char* error;
+
+    dlerror();
+    *(void **) (&info_func) = dlsym((void*)handle, "GetLibraryList");
+    if ((error = dlerror()) == NULL)
+        result = (*info_func)();
+    else
+    {
+        LOGE("dlsym error: \"%s\"", error);
+        result = "unknown";
+    }
+
+    return env->NewStringUTF(result);
 }
 
 JNIEXPORT jstring JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_getVersionName
-  (JNIEnv* env, jobject, jlong)
+  (JNIEnv* env, jobject, jlong handle)
 {
-    return env->NewStringUTF("9.9");
+    const char* (*info_func)();
+    const char* result;
+    const char* error;
+
+    dlerror();
+    *(void **) (&info_func) = dlsym((void*)handle, "GetRevision");
+    if ((error = dlerror()) == NULL)
+        result = (*info_func)();
+    else
+    {
+        LOGE("dlsym error: \"%s\"", error);
+        result = "unknown";
+    }
+
+    return env->NewStringUTF(result);
 }
 
 JNIEXPORT void JNICALL Java_org_opencv_engine_OpenCVLibraryInfo_close
-  (JNIEnv* env, jobject, jlong)
+  (JNIEnv*, jobject, jlong handle)
 {
-
+    dlclose((void*)handle);
 }
diff --git a/android/service/engine/src/org/opencv/engine/OpenCVLibraryInfo.java b/android/service/engine/src/org/opencv/engine/OpenCVLibraryInfo.java
index c1709b81ba..55ae368584 100644
--- a/android/service/engine/src/org/opencv/engine/OpenCVLibraryInfo.java
+++ b/android/service/engine/src/org/opencv/engine/OpenCVLibraryInfo.java
@@ -2,7 +2,7 @@ package org.opencv.engine;
 
 public class OpenCVLibraryInfo {
     public OpenCVLibraryInfo(String packagePath) {
-        mNativeObj = open(packagePath);
+        mNativeObj = open(packagePath + "/libopencv_info.so");
         if (mNativeObj != 0) {
             mPackageName = getPackageName(mNativeObj);
             mLibraryList = getLibraryList(mNativeObj);