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);