Issue #2316 Change default libnative_camera path implemented.

This commit is contained in:
Alexander Smorkalov 2012-09-10 16:28:56 +04:00
parent e564a53ccd
commit 86c7e183d2
2 changed files with 67 additions and 33 deletions

View File

@ -5,7 +5,7 @@ ENDIF()
set(the_description "Auxiliary module for Android native camera support") set(the_description "Auxiliary module for Android native camera support")
set(OPENCV_MODULE_TYPE STATIC) set(OPENCV_MODULE_TYPE STATIC)
ocv_define_module(androidcamera INTERNAL log dl) ocv_define_module(androidcamera INTERNAL opencv_core log dl)
ocv_include_directories("${CMAKE_CURRENT_SOURCE_DIR}/camera_wrapper") ocv_include_directories("${CMAKE_CURRENT_SOURCE_DIR}/camera_wrapper")
# Android source tree for native camera # Android source tree for native camera

View File

@ -1,8 +1,12 @@
#include <dlfcn.h> #include <dlfcn.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <android/log.h> #include <android/log.h>
#include <string> #include <string>
#include <vector> #include <vector>
#include <algorithm> #include <algorithm>
#include <opencv2/core/version.hpp>
#include "camera_activity.hpp" #include "camera_activity.hpp"
#include "camera_wrapper.h" #include "camera_wrapper.h"
@ -41,6 +45,7 @@ private:
static bool isConnectedToLib; static bool isConnectedToLib;
static std::string getPathLibFolder(); static std::string getPathLibFolder();
static std::string getDefaultPathLibFolder();
static CameraActivity::ErrorCode connectToLib(); static CameraActivity::ErrorCode connectToLib();
static CameraActivity::ErrorCode getSymbolFromLib(void * libHandle, const char* symbolName, void** ppSymbol); static CameraActivity::ErrorCode getSymbolFromLib(void * libHandle, const char* symbolName, void** ppSymbol);
static void fillListWrapperLibs(const string& folderPath, vector<string>& listLibs); static void fillListWrapperLibs(const string& folderPath, vector<string>& listLibs);
@ -55,8 +60,6 @@ private:
}; };
std::string CameraWrapperConnector::pathLibFolder; std::string CameraWrapperConnector::pathLibFolder;
#define DEFAULT_WRAPPER_PACKAGE_NAME "com.NativeCamera"
#define DEFAULT_PATH_LIB_FOLDER "/data/data/" DEFAULT_WRAPPER_PACKAGE_NAME "/lib/"
bool CameraWrapperConnector::isConnectedToLib=false; bool CameraWrapperConnector::isConnectedToLib=false;
InitCameraConnectC CameraWrapperConnector::pInitCameraC = 0; InitCameraConnectC CameraWrapperConnector::pInitCameraC = 0;
@ -163,7 +166,13 @@ CameraActivity::ErrorCode CameraWrapperConnector::connectToLib()
} }
dlerror(); dlerror();
string folderPath=getPathLibFolder(); string folderPath = getPathLibFolder();
if (folderPath.empty())
{
LOGD("Trying to find native camera in default OpenCV packages");
folderPath = getDefaultPathLibFolder();
}
LOGD("CameraWrapperConnector::connectToLib: folderPath=%s", folderPath.c_str()); LOGD("CameraWrapperConnector::connectToLib: folderPath=%s", folderPath.c_str());
vector<string> listLibs; vector<string> listLibs;
@ -256,6 +265,31 @@ void CameraWrapperConnector::fillListWrapperLibs(const string& folderPath, vecto
} }
} }
std::string CameraWrapperConnector::getDefaultPathLibFolder()
{
const string packageList[] = {"tegra3", "armv7a_neon", "armv7a", "armv5", "x86"};
for (size_t i = 0; i < 5; i++)
{
char path[128];
sprintf(path, "/data/data/org.opencv.lib_v%d%d_%s/lib/", CV_MAJOR_VERSION, CV_MINOR_VERSION, packageList[i].c_str());
LOGD("Trying package \"%s\" (\"%s\")", packageList[i], path);
DIR* dir = opendir(path);
if (!dir)
{
LOGD("Package not found");
continue;
}
else
{
closedir(dir);
return path;
}
}
return string();
}
std::string CameraWrapperConnector::getPathLibFolder() std::string CameraWrapperConnector::getPathLibFolder()
{ {
if (!pathLibFolder.empty()) if (!pathLibFolder.empty())
@ -278,41 +312,41 @@ std::string CameraWrapperConnector::getPathLibFolder()
{ {
while (fgets(lineBuf, sizeof lineBuf, file) != NULL) while (fgets(lineBuf, sizeof lineBuf, file) != NULL)
{ {
//verify that line ends with library name //verify that line ends with library name
int lineLength = strlen(lineBuf); int lineLength = strlen(lineBuf);
int libNameLength = strlen(libName); int libNameLength = strlen(libName);
//trim end //trim end
for(int i = lineLength - 1; i >= 0 && isspace(lineBuf[i]); --i) for(int i = lineLength - 1; i >= 0 && isspace(lineBuf[i]); --i)
{ {
lineBuf[i] = 0; lineBuf[i] = 0;
--lineLength; --lineLength;
} }
if (0 != strncmp(lineBuf + lineLength - libNameLength, libName, libNameLength)) if (0 != strncmp(lineBuf + lineLength - libNameLength, libName, libNameLength))
{ {
//the line does not contain the library name //the line does not contain the library name
continue; continue;
} }
//extract path from smaps line //extract path from smaps line
char* pathBegin = strchr(lineBuf, '/'); char* pathBegin = strchr(lineBuf, '/');
if (0 == pathBegin) if (0 == pathBegin)
{ {
LOGE("Strange error: could not find path beginning in lin \"%s\"", lineBuf); LOGE("Strange error: could not find path beginning in lin \"%s\"", lineBuf);
continue; continue;
} }
char* pathEnd = strrchr(pathBegin, '/'); char* pathEnd = strrchr(pathBegin, '/');
pathEnd[1] = 0; pathEnd[1] = 0;
LOGD("Libraries folder found: %s", pathBegin); LOGD("Libraries folder found: %s", pathBegin);
fclose(file); fclose(file);
return pathBegin; return pathBegin;
} }
fclose(file); fclose(file);
LOGE("Could not find library path."); LOGE("Could not find library path");
} }
else else
{ {
@ -321,10 +355,10 @@ std::string CameraWrapperConnector::getPathLibFolder()
} }
else else
{ {
LOGE("Could not get library name and base address."); LOGE("Could not get library name and base address");
} }
return DEFAULT_PATH_LIB_FOLDER ; return string();
} }
void CameraWrapperConnector::setPathLibFolder(const string& path) void CameraWrapperConnector::setPathLibFolder(const string& path)