Compare commits
102 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cdbda45125 | |||
| 13735decf3 | |||
| 7c2270bb3b | |||
| f0bff1b64f | |||
| 4ac3eb04c4 | |||
| 892a0e28ad | |||
| 01d08208f6 | |||
| d943c35ef7 | |||
| a5c3c1a7de | |||
| 960a03ca65 | |||
| 4b8863c933 | |||
| 73a798e718 | |||
| 1ba250b69c | |||
| 50c49f73f8 | |||
| 94f05241c5 | |||
| efdc055fb1 | |||
| 5615ec7c97 | |||
| d386667478 | |||
| a0ce328f98 | |||
| 7294ccba3c | |||
| 9c60412480 | |||
| e5067bff41 | |||
| 65b53f96d0 | |||
| a78bd92b8e | |||
| c68eb408c0 | |||
| de153f0154 | |||
| 81a5415417 | |||
| d2b36d74cd | |||
| 139cc61001 | |||
| aa911275c3 | |||
| af912f4843 | |||
| 721c24bc1f | |||
| a66cd5698a | |||
| cf97209f95 | |||
| d4df1e0b5c | |||
| 5a7804d958 | |||
| 088a6597bc | |||
| 3a40f27655 | |||
| b368f99d03 | |||
| 304dac7f00 | |||
| 17fd1c7c61 | |||
| 57fb5f0981 | |||
| 35a31e1c35 | |||
| 37a63523e7 | |||
| a71797c0c4 | |||
| 5715d9ef42 | |||
| ab69f5e091 | |||
| 54ee92e3b0 | |||
| b28b2428f6 | |||
| 2dcb091d94 | |||
| 162f9fd7ea | |||
| b156e2f7ed | |||
| 3def843652 | |||
| 01570fa800 | |||
| 680a44189c | |||
| 2777ebb8a0 | |||
| 6cca6a4548 | |||
| 150aeee58f | |||
| 59ce0a9f81 | |||
| 5c19c6cb67 | |||
| f666bd221f | |||
| bd0e0b5800 | |||
| 73c152abc4 | |||
| ab20da0f53 | |||
| 4b1724aeb9 | |||
| a3c4d1b679 | |||
| e0b1697cc9 | |||
| 059b79f7c2 | |||
| 8159ea3386 | |||
| 50c2443691 | |||
| 0bd287a8f2 | |||
| 2ee917c646 | |||
| ca0962c738 | |||
| daad7900e2 | |||
| 9ad470ba5c | |||
| 4e4b96e3d9 | |||
| 4ddcc31edc | |||
| 81a5988015 | |||
| 052d2dc23a | |||
| 949c4edf41 | |||
| 7b5a45eac4 | |||
| 72d2311edf | |||
| d382fa56c7 | |||
| 00117d2a6e | |||
| 4ce8de5174 | |||
| e1c4fd9e1f | |||
| 70166820ea | |||
| aebed446b1 | |||
| c3577a288b | |||
| 50ad690993 | |||
| caddd398e6 | |||
| e62f147edc | |||
| b7c1fd34b9 | |||
| ba238562c6 | |||
| 01e93d57f0 | |||
| 86524b0e4a | |||
| 70f74b70b7 | |||
| 10459a886b | |||
| 215dd2a41b | |||
| 025f6674db | |||
| 3f5d722f34 | |||
| ab4025f8de |
@@ -0,0 +1,502 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// multimon.h -- Stub module that fakes multiple monitor apis on Win32 OSes
|
||||
// without them.
|
||||
//
|
||||
// By using this header your code will get back default values from
|
||||
// GetSystemMetrics() for new metrics, and the new multimonitor APIs
|
||||
// will act like only one display is present on a Win32 OS without
|
||||
// multimonitor APIs.
|
||||
//
|
||||
// Exactly one source must include this with COMPILE_MULTIMON_STUBS defined.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" { // Assume C declarations for C++
|
||||
#endif // __cplusplus
|
||||
|
||||
//
|
||||
// If we are building with Win95/NT4 headers, we need to declare
|
||||
// the multimonitor-related metrics and APIs ourselves.
|
||||
//
|
||||
#ifndef SM_CMONITORS
|
||||
|
||||
#define SM_XVIRTUALSCREEN 76
|
||||
#define SM_YVIRTUALSCREEN 77
|
||||
#define SM_CXVIRTUALSCREEN 78
|
||||
#define SM_CYVIRTUALSCREEN 79
|
||||
#define SM_CMONITORS 80
|
||||
#define SM_SAMEDISPLAYFORMAT 81
|
||||
|
||||
// HMONITOR is already declared if WINVER >= 0x0500 in windef.h
|
||||
// This is for components built with an older version number.
|
||||
//
|
||||
#if !defined(HMONITOR_DECLARED) && (WINVER < 0x0500)
|
||||
DECLARE_HANDLE(HMONITOR);
|
||||
#define HMONITOR_DECLARED
|
||||
#endif
|
||||
|
||||
#define MONITOR_DEFAULTTONULL 0x00000000
|
||||
#define MONITOR_DEFAULTTOPRIMARY 0x00000001
|
||||
#define MONITOR_DEFAULTTONEAREST 0x00000002
|
||||
|
||||
#define MONITORINFOF_PRIMARY 0x00000001
|
||||
|
||||
typedef struct tagMONITORINFO
|
||||
{
|
||||
DWORD cbSize;
|
||||
RECT rcMonitor;
|
||||
RECT rcWork;
|
||||
DWORD dwFlags;
|
||||
} MONITORINFO, *LPMONITORINFO;
|
||||
|
||||
#ifndef CCHDEVICENAME
|
||||
#define CCHDEVICENAME 32
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
typedef struct tagMONITORINFOEXA : public tagMONITORINFO
|
||||
{
|
||||
CHAR szDevice[CCHDEVICENAME];
|
||||
} MONITORINFOEXA, *LPMONITORINFOEXA;
|
||||
typedef struct tagMONITORINFOEXW : public tagMONITORINFO
|
||||
{
|
||||
WCHAR szDevice[CCHDEVICENAME];
|
||||
} MONITORINFOEXW, *LPMONITORINFOEXW;
|
||||
#ifdef UNICODE
|
||||
typedef MONITORINFOEXW MONITORINFOEX;
|
||||
typedef LPMONITORINFOEXW LPMONITORINFOEX;
|
||||
#else
|
||||
typedef MONITORINFOEXA MONITORINFOEX;
|
||||
typedef LPMONITORINFOEXA LPMONITORINFOEX;
|
||||
#endif // UNICODE
|
||||
#else // ndef __cplusplus
|
||||
typedef struct tagMONITORINFOEXA
|
||||
{
|
||||
MONITORINFO;
|
||||
CHAR szDevice[CCHDEVICENAME];
|
||||
} MONITORINFOEXA, *LPMONITORINFOEXA;
|
||||
typedef struct tagMONITORINFOEXW
|
||||
{
|
||||
MONITORINFO;
|
||||
WCHAR szDevice[CCHDEVICENAME];
|
||||
} MONITORINFOEXW, *LPMONITORINFOEXW;
|
||||
#ifdef UNICODE
|
||||
typedef MONITORINFOEXW MONITORINFOEX;
|
||||
typedef LPMONITORINFOEXW LPMONITORINFOEX;
|
||||
#else
|
||||
typedef MONITORINFOEXA MONITORINFOEX;
|
||||
typedef LPMONITORINFOEXA LPMONITORINFOEX;
|
||||
#endif // UNICODE
|
||||
#endif
|
||||
|
||||
typedef BOOL (CALLBACK* MONITORENUMPROC)(HMONITOR, HDC, LPRECT, LPARAM);
|
||||
|
||||
#ifndef DISPLAY_DEVICE_ATTACHED_TO_DESKTOP
|
||||
typedef struct _DISPLAY_DEVICEA {
|
||||
DWORD cb;
|
||||
CHAR DeviceName[32];
|
||||
CHAR DeviceString[128];
|
||||
DWORD StateFlags;
|
||||
CHAR DeviceID[128];
|
||||
CHAR DeviceKey[128];
|
||||
} DISPLAY_DEVICEA, *PDISPLAY_DEVICEA, *LPDISPLAY_DEVICEA;
|
||||
typedef struct _DISPLAY_DEVICEW {
|
||||
DWORD cb;
|
||||
WCHAR DeviceName[32];
|
||||
WCHAR DeviceString[128];
|
||||
DWORD StateFlags;
|
||||
WCHAR DeviceID[128];
|
||||
WCHAR DeviceKey[128];
|
||||
} DISPLAY_DEVICEW, *PDISPLAY_DEVICEW, *LPDISPLAY_DEVICEW;
|
||||
#ifdef UNICODE
|
||||
typedef DISPLAY_DEVICEW DISPLAY_DEVICE;
|
||||
typedef PDISPLAY_DEVICEW PDISPLAY_DEVICE;
|
||||
typedef LPDISPLAY_DEVICEW LPDISPLAY_DEVICE;
|
||||
#else
|
||||
typedef DISPLAY_DEVICEA DISPLAY_DEVICE;
|
||||
typedef PDISPLAY_DEVICEA PDISPLAY_DEVICE;
|
||||
typedef LPDISPLAY_DEVICEA LPDISPLAY_DEVICE;
|
||||
#endif // UNICODE
|
||||
|
||||
#define DISPLAY_DEVICE_ATTACHED_TO_DESKTOP 0x00000001
|
||||
#define DISPLAY_DEVICE_MULTI_DRIVER 0x00000002
|
||||
#define DISPLAY_DEVICE_PRIMARY_DEVICE 0x00000004
|
||||
#define DISPLAY_DEVICE_MIRRORING_DRIVER 0x00000008
|
||||
#define DISPLAY_DEVICE_VGA_COMPATIBLE 0x00000010
|
||||
#endif
|
||||
|
||||
#endif // SM_CMONITORS
|
||||
|
||||
#undef GetMonitorInfo
|
||||
#undef GetSystemMetrics
|
||||
#undef MonitorFromWindow
|
||||
#undef MonitorFromRect
|
||||
#undef MonitorFromPoint
|
||||
#undef EnumDisplayMonitors
|
||||
#undef EnumDisplayDevices
|
||||
|
||||
//
|
||||
// Define COMPILE_MULTIMON_STUBS to compile the stubs;
|
||||
// otherwise, you get the declarations.
|
||||
//
|
||||
#ifdef COMPILE_MULTIMON_STUBS
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// Implement the API stubs.
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _MULTIMON_USE_SECURE_CRT
|
||||
#if defined(__GOT_SECURE_LIB__) && __GOT_SECURE_LIB__ >= 200402L
|
||||
#define _MULTIMON_USE_SECURE_CRT 1
|
||||
#else
|
||||
#define _MULTIMON_USE_SECURE_CRT 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef MULTIMON_FNS_DEFINED
|
||||
|
||||
int (WINAPI* g_pfnGetSystemMetrics)(int) = NULL;
|
||||
HMONITOR (WINAPI* g_pfnMonitorFromWindow)(HWND, DWORD) = NULL;
|
||||
HMONITOR (WINAPI* g_pfnMonitorFromRect)(LPCRECT, DWORD) = NULL;
|
||||
HMONITOR (WINAPI* g_pfnMonitorFromPoint)(POINT, DWORD) = NULL;
|
||||
BOOL (WINAPI* g_pfnGetMonitorInfo)(HMONITOR, LPMONITORINFO) = NULL;
|
||||
BOOL (WINAPI* g_pfnEnumDisplayMonitors)(HDC, LPCRECT, MONITORENUMPROC, LPARAM) = NULL;
|
||||
BOOL (WINAPI* g_pfnEnumDisplayDevices)(PVOID, DWORD, PDISPLAY_DEVICE,DWORD) = NULL;
|
||||
BOOL g_fMultiMonInitDone = FALSE;
|
||||
BOOL g_fMultimonPlatformNT = FALSE;
|
||||
|
||||
#endif
|
||||
|
||||
BOOL IsPlatformNT()
|
||||
{
|
||||
OSVERSIONINFOA osvi = {0};
|
||||
osvi.dwOSVersionInfoSize = sizeof(osvi);
|
||||
GetVersionExA((OSVERSIONINFOA*)&osvi);
|
||||
return (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId);
|
||||
}
|
||||
|
||||
BOOL InitMultipleMonitorStubs(void)
|
||||
{
|
||||
HMODULE hUser32;
|
||||
if (g_fMultiMonInitDone)
|
||||
{
|
||||
return g_pfnGetMonitorInfo != NULL;
|
||||
}
|
||||
|
||||
g_fMultimonPlatformNT = IsPlatformNT();
|
||||
hUser32 = GetModuleHandle(TEXT("USER32"));
|
||||
if (hUser32 &&
|
||||
(*(FARPROC*)&g_pfnGetSystemMetrics = GetProcAddress(hUser32,"GetSystemMetrics")) != NULL &&
|
||||
(*(FARPROC*)&g_pfnMonitorFromWindow = GetProcAddress(hUser32,"MonitorFromWindow")) != NULL &&
|
||||
(*(FARPROC*)&g_pfnMonitorFromRect = GetProcAddress(hUser32,"MonitorFromRect")) != NULL &&
|
||||
(*(FARPROC*)&g_pfnMonitorFromPoint = GetProcAddress(hUser32,"MonitorFromPoint")) != NULL &&
|
||||
(*(FARPROC*)&g_pfnEnumDisplayMonitors = GetProcAddress(hUser32,"EnumDisplayMonitors")) != NULL &&
|
||||
#ifdef UNICODE
|
||||
(*(FARPROC*)&g_pfnEnumDisplayDevices = GetProcAddress(hUser32,"EnumDisplayDevicesW")) != NULL &&
|
||||
(*(FARPROC*)&g_pfnGetMonitorInfo = g_fMultimonPlatformNT ? GetProcAddress(hUser32,"GetMonitorInfoW") :
|
||||
GetProcAddress(hUser32,"GetMonitorInfoA")) != NULL
|
||||
#else
|
||||
(*(FARPROC*)&g_pfnGetMonitorInfo = GetProcAddress(hUser32,"GetMonitorInfoA")) != NULL &&
|
||||
(*(FARPROC*)&g_pfnEnumDisplayDevices = GetProcAddress(hUser32,"EnumDisplayDevicesA")) != NULL
|
||||
#endif
|
||||
) {
|
||||
g_fMultiMonInitDone = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_pfnGetSystemMetrics = NULL;
|
||||
g_pfnMonitorFromWindow = NULL;
|
||||
g_pfnMonitorFromRect = NULL;
|
||||
g_pfnMonitorFromPoint = NULL;
|
||||
g_pfnGetMonitorInfo = NULL;
|
||||
g_pfnEnumDisplayMonitors = NULL;
|
||||
g_pfnEnumDisplayDevices = NULL;
|
||||
|
||||
g_fMultiMonInitDone = TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// fake implementations of Monitor APIs that work with the primary display
|
||||
// no special parameter validation is made since these run in client code
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
int WINAPI
|
||||
xGetSystemMetrics(int nIndex)
|
||||
{
|
||||
if (InitMultipleMonitorStubs())
|
||||
return g_pfnGetSystemMetrics(nIndex);
|
||||
|
||||
switch (nIndex)
|
||||
{
|
||||
case SM_CMONITORS:
|
||||
case SM_SAMEDISPLAYFORMAT:
|
||||
return 1;
|
||||
|
||||
case SM_XVIRTUALSCREEN:
|
||||
case SM_YVIRTUALSCREEN:
|
||||
return 0;
|
||||
|
||||
case SM_CXVIRTUALSCREEN:
|
||||
nIndex = SM_CXSCREEN;
|
||||
break;
|
||||
|
||||
case SM_CYVIRTUALSCREEN:
|
||||
nIndex = SM_CYSCREEN;
|
||||
break;
|
||||
}
|
||||
|
||||
return GetSystemMetrics(nIndex);
|
||||
}
|
||||
|
||||
#define xPRIMARY_MONITOR ((HMONITOR)0x12340042)
|
||||
|
||||
HMONITOR WINAPI
|
||||
xMonitorFromPoint(POINT ptScreenCoords, DWORD dwFlags)
|
||||
{
|
||||
if (InitMultipleMonitorStubs())
|
||||
return g_pfnMonitorFromPoint(ptScreenCoords, dwFlags);
|
||||
|
||||
if ((dwFlags & (MONITOR_DEFAULTTOPRIMARY | MONITOR_DEFAULTTONEAREST)) ||
|
||||
((ptScreenCoords.x >= 0) &&
|
||||
(ptScreenCoords.x < GetSystemMetrics(SM_CXSCREEN)) &&
|
||||
(ptScreenCoords.y >= 0) &&
|
||||
(ptScreenCoords.y < GetSystemMetrics(SM_CYSCREEN))))
|
||||
{
|
||||
return xPRIMARY_MONITOR;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
HMONITOR WINAPI
|
||||
xMonitorFromRect(LPCRECT lprcScreenCoords, DWORD dwFlags)
|
||||
{
|
||||
if (InitMultipleMonitorStubs())
|
||||
return g_pfnMonitorFromRect(lprcScreenCoords, dwFlags);
|
||||
|
||||
if ((dwFlags & (MONITOR_DEFAULTTOPRIMARY | MONITOR_DEFAULTTONEAREST)) ||
|
||||
((lprcScreenCoords->right > 0) &&
|
||||
(lprcScreenCoords->bottom > 0) &&
|
||||
(lprcScreenCoords->left < GetSystemMetrics(SM_CXSCREEN)) &&
|
||||
(lprcScreenCoords->top < GetSystemMetrics(SM_CYSCREEN))))
|
||||
{
|
||||
return xPRIMARY_MONITOR;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
HMONITOR WINAPI
|
||||
xMonitorFromWindow(HWND hWnd, DWORD dwFlags)
|
||||
{
|
||||
WINDOWPLACEMENT wp;
|
||||
|
||||
if (InitMultipleMonitorStubs())
|
||||
return g_pfnMonitorFromWindow(hWnd, dwFlags);
|
||||
|
||||
if (dwFlags & (MONITOR_DEFAULTTOPRIMARY | MONITOR_DEFAULTTONEAREST))
|
||||
return xPRIMARY_MONITOR;
|
||||
|
||||
if (IsIconic(hWnd) ?
|
||||
GetWindowPlacement(hWnd, &wp) :
|
||||
GetWindowRect(hWnd, &wp.rcNormalPosition)) {
|
||||
|
||||
return xMonitorFromRect(&wp.rcNormalPosition, dwFlags);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
BOOL WINAPI
|
||||
xGetMonitorInfo(HMONITOR hMonitor, __inout LPMONITORINFO lpMonitorInfo)
|
||||
{
|
||||
RECT rcWork;
|
||||
|
||||
if (InitMultipleMonitorStubs())
|
||||
{
|
||||
BOOL f = g_pfnGetMonitorInfo(hMonitor, lpMonitorInfo);
|
||||
#ifdef UNICODE
|
||||
if (f && !g_fMultimonPlatformNT && (lpMonitorInfo->cbSize >= sizeof(MONITORINFOEX)))
|
||||
{
|
||||
MultiByteToWideChar(CP_ACP, 0,
|
||||
(LPSTR)((MONITORINFOEX*)lpMonitorInfo)->szDevice, -1,
|
||||
((MONITORINFOEX*)lpMonitorInfo)->szDevice, (sizeof(((MONITORINFOEX*)lpMonitorInfo)->szDevice)/sizeof(TCHAR)));
|
||||
}
|
||||
#endif
|
||||
return f;
|
||||
}
|
||||
|
||||
if ((hMonitor == xPRIMARY_MONITOR) &&
|
||||
lpMonitorInfo &&
|
||||
(lpMonitorInfo->cbSize >= sizeof(MONITORINFO)) &&
|
||||
SystemParametersInfoA(SPI_GETWORKAREA, 0, &rcWork, 0))
|
||||
{
|
||||
lpMonitorInfo->rcMonitor.left = 0;
|
||||
lpMonitorInfo->rcMonitor.top = 0;
|
||||
lpMonitorInfo->rcMonitor.right = GetSystemMetrics(SM_CXSCREEN);
|
||||
lpMonitorInfo->rcMonitor.bottom = GetSystemMetrics(SM_CYSCREEN);
|
||||
lpMonitorInfo->rcWork = rcWork;
|
||||
lpMonitorInfo->dwFlags = MONITORINFOF_PRIMARY;
|
||||
|
||||
if (lpMonitorInfo->cbSize >= sizeof(MONITORINFOEX))
|
||||
{
|
||||
#ifdef UNICODE
|
||||
MultiByteToWideChar(CP_ACP, 0, "DISPLAY", -1, ((MONITORINFOEX*)lpMonitorInfo)->szDevice, (sizeof(((MONITORINFOEX*)lpMonitorInfo)->szDevice)/sizeof(TCHAR)));
|
||||
#else // UNICODE
|
||||
#if _MULTIMON_USE_SECURE_CRT
|
||||
strncpy_s(((MONITORINFOEX*)lpMonitorInfo)->szDevice, (sizeof(((MONITORINFOEX*)lpMonitorInfo)->szDevice)/sizeof(TCHAR)), TEXT("DISPLAY"), (sizeof(((MONITORINFOEX*)lpMonitorInfo)->szDevice)/sizeof(TCHAR)) - 1);
|
||||
#else
|
||||
lstrcpyn(((MONITORINFOEX*)lpMonitorInfo)->szDevice, TEXT("DISPLAY"), (sizeof(((MONITORINFOEX*)lpMonitorInfo)->szDevice)/sizeof(TCHAR)));
|
||||
#endif // _MULTIMON_USE_SECURE_CRT
|
||||
#endif // UNICODE
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL WINAPI
|
||||
xEnumDisplayMonitors(
|
||||
HDC hdcOptionalForPainting,
|
||||
LPCRECT lprcEnumMonitorsThatIntersect,
|
||||
MONITORENUMPROC lpfnEnumProc,
|
||||
LPARAM dwData)
|
||||
{
|
||||
RECT rcLimit;
|
||||
|
||||
if (InitMultipleMonitorStubs()) {
|
||||
return g_pfnEnumDisplayMonitors(
|
||||
hdcOptionalForPainting,
|
||||
lprcEnumMonitorsThatIntersect,
|
||||
lpfnEnumProc,
|
||||
dwData);
|
||||
}
|
||||
|
||||
if (!lpfnEnumProc)
|
||||
return FALSE;
|
||||
|
||||
rcLimit.left = 0;
|
||||
rcLimit.top = 0;
|
||||
rcLimit.right = GetSystemMetrics(SM_CXSCREEN);
|
||||
rcLimit.bottom = GetSystemMetrics(SM_CYSCREEN);
|
||||
|
||||
if (hdcOptionalForPainting)
|
||||
{
|
||||
RECT rcClip;
|
||||
POINT ptOrg;
|
||||
|
||||
switch (GetClipBox(hdcOptionalForPainting, &rcClip))
|
||||
{
|
||||
default:
|
||||
if (!GetDCOrgEx(hdcOptionalForPainting, &ptOrg))
|
||||
return FALSE;
|
||||
|
||||
OffsetRect(&rcLimit, -ptOrg.x, -ptOrg.y);
|
||||
if (IntersectRect(&rcLimit, &rcLimit, &rcClip) &&
|
||||
(!lprcEnumMonitorsThatIntersect ||
|
||||
IntersectRect(&rcLimit, &rcLimit, lprcEnumMonitorsThatIntersect))) {
|
||||
|
||||
break;
|
||||
}
|
||||
//fall thru
|
||||
case NULLREGION:
|
||||
return TRUE;
|
||||
case ERROR:
|
||||
return FALSE;
|
||||
}
|
||||
} else {
|
||||
if ( lprcEnumMonitorsThatIntersect &&
|
||||
!IntersectRect(&rcLimit, &rcLimit, lprcEnumMonitorsThatIntersect)) {
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return lpfnEnumProc(
|
||||
xPRIMARY_MONITOR,
|
||||
hdcOptionalForPainting,
|
||||
&rcLimit,
|
||||
dwData);
|
||||
}
|
||||
|
||||
BOOL WINAPI
|
||||
xEnumDisplayDevices(
|
||||
PVOID Unused,
|
||||
DWORD iDevNum,
|
||||
__inout PDISPLAY_DEVICE lpDisplayDevice,
|
||||
DWORD dwFlags)
|
||||
{
|
||||
if (InitMultipleMonitorStubs())
|
||||
return g_pfnEnumDisplayDevices(Unused, iDevNum, lpDisplayDevice, dwFlags);
|
||||
|
||||
if (Unused != NULL)
|
||||
return FALSE;
|
||||
|
||||
if (iDevNum != 0)
|
||||
return FALSE;
|
||||
|
||||
if (lpDisplayDevice == NULL || lpDisplayDevice->cb < sizeof(DISPLAY_DEVICE))
|
||||
return FALSE;
|
||||
|
||||
#ifdef UNICODE
|
||||
MultiByteToWideChar(CP_ACP, 0, "DISPLAY", -1, lpDisplayDevice->DeviceName, (sizeof(lpDisplayDevice->DeviceName)/sizeof(TCHAR)));
|
||||
MultiByteToWideChar(CP_ACP, 0, "DISPLAY", -1, lpDisplayDevice->DeviceString, (sizeof(lpDisplayDevice->DeviceString)/sizeof(TCHAR)));
|
||||
#else // UNICODE
|
||||
#if _MULTIMON_USE_SECURE_CRT
|
||||
strncpy_s((LPTSTR)lpDisplayDevice->DeviceName, (sizeof(lpDisplayDevice->DeviceName)/sizeof(TCHAR)), TEXT("DISPLAY"), (sizeof(lpDisplayDevice->DeviceName)/sizeof(TCHAR)) - 1);
|
||||
strncpy_s((LPTSTR)lpDisplayDevice->DeviceString, (sizeof(lpDisplayDevice->DeviceString)/sizeof(TCHAR)), TEXT("DISPLAY"), (sizeof(lpDisplayDevice->DeviceName)/sizeof(TCHAR)) - 1);
|
||||
#else
|
||||
lstrcpyn((LPTSTR)lpDisplayDevice->DeviceName, TEXT("DISPLAY"), (sizeof(lpDisplayDevice->DeviceName)/sizeof(TCHAR)));
|
||||
lstrcpyn((LPTSTR)lpDisplayDevice->DeviceString, TEXT("DISPLAY"), (sizeof(lpDisplayDevice->DeviceString)/sizeof(TCHAR)));
|
||||
#endif // _MULTIMON_USE_SECURE_CRT
|
||||
#endif // UNICODE
|
||||
|
||||
lpDisplayDevice->StateFlags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#undef xPRIMARY_MONITOR
|
||||
#undef COMPILE_MULTIMON_STUBS
|
||||
|
||||
#else // COMPILE_MULTIMON_STUBS
|
||||
|
||||
extern int WINAPI xGetSystemMetrics(int);
|
||||
extern HMONITOR WINAPI xMonitorFromWindow(HWND, DWORD);
|
||||
extern HMONITOR WINAPI xMonitorFromRect(LPCRECT, DWORD);
|
||||
extern HMONITOR WINAPI xMonitorFromPoint(POINT, DWORD);
|
||||
extern BOOL WINAPI xGetMonitorInfo(HMONITOR, LPMONITORINFO);
|
||||
extern BOOL WINAPI xEnumDisplayMonitors(HDC, LPCRECT, MONITORENUMPROC, LPARAM);
|
||||
extern BOOL WINAPI xEnumDisplayDevices(PVOID, DWORD, PDISPLAY_DEVICE, DWORD);
|
||||
|
||||
#endif // COMPILE_MULTIMON_STUBS
|
||||
|
||||
//
|
||||
// build defines that replace the regular APIs with our versions
|
||||
//
|
||||
#define GetSystemMetrics xGetSystemMetrics
|
||||
#define MonitorFromWindow xMonitorFromWindow
|
||||
#define MonitorFromRect xMonitorFromRect
|
||||
#define MonitorFromPoint xMonitorFromPoint
|
||||
#define GetMonitorInfo xGetMonitorInfo
|
||||
#define EnumDisplayMonitors xEnumDisplayMonitors
|
||||
#define EnumDisplayDevices xEnumDisplayDevices
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
|
||||
@@ -7,31 +7,24 @@ project(${JASPER_LIBRARY})
|
||||
|
||||
add_definitions(-DEXCLUDE_MIF_SUPPORT -DEXCLUDE_PNM_SUPPORT -DEXCLUDE_BMP_SUPPORT -DEXCLUDE_RAS_SUPPORT -DEXCLUDE_JPG_SUPPORT -DEXCLUDE_PGX_SUPPORT)
|
||||
|
||||
# List of C++ files:
|
||||
ocv_include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
# The .cpp files:
|
||||
file(GLOB lib_srcs *.c)
|
||||
file(GLOB lib_hdrs *.h)
|
||||
file(GLOB lib_ext_hdrs jasper/*.h)
|
||||
|
||||
# ----------------------------------------------------------------------------------
|
||||
# Define the library target:
|
||||
# Define the library target:
|
||||
# ----------------------------------------------------------------------------------
|
||||
|
||||
add_library(${JASPER_LIBRARY} STATIC ${lib_srcs} ${lib_hdrs} ${lib_ext_hdrs})
|
||||
|
||||
if(MSVC)
|
||||
if(NOT ENABLE_NOISY_WARNINGS)
|
||||
string(REPLACE "/W3" "/W0" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
|
||||
string(REPLACE "/W4" "/W0" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||
endif()
|
||||
add_definitions(-DJAS_WIN_MSVC_BUILD)
|
||||
endif()
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-uninitialized")
|
||||
endif()
|
||||
ocv_warnings_disable(CMAKE_C_FLAGS -Wno-implicit-function-declaration -Wno-uninitialized -Wmissing-prototypes -Wmissing-declarations -Wunused -Wshadow -Wsign-compare
|
||||
/wd4013 /wd4018 /wd4715 /wd4244 /wd4101 /wd4267)
|
||||
|
||||
if(UNIX)
|
||||
if(CMAKE_COMPILER_IS_GNUCXX OR CV_ICC)
|
||||
@@ -39,22 +32,18 @@ if(UNIX)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCXX AND NOT ENABLE_NOISY_WARNINGS)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-implicit-function-declaration -Wno-unused")
|
||||
endif()
|
||||
|
||||
set_target_properties(${JASPER_LIBRARY}
|
||||
PROPERTIES
|
||||
OUTPUT_NAME ${JASPER_LIBRARY}
|
||||
DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}"
|
||||
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/3rdparty/${OPENCV_LIB_INSTALL_PATH}"
|
||||
)
|
||||
|
||||
PROPERTIES
|
||||
OUTPUT_NAME ${JASPER_LIBRARY}
|
||||
DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}"
|
||||
ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH}
|
||||
)
|
||||
|
||||
if(ENABLE_SOLUTION_FOLDERS)
|
||||
set_target_properties(${JASPER_LIBRARY} PROPERTIES FOLDER "3rdparty")
|
||||
endif()
|
||||
|
||||
if(NOT BUILD_SHARED_LIBS)
|
||||
install(TARGETS ${JASPER_LIBRARY} ARCHIVE DESTINATION share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH} COMPONENT main)
|
||||
endif()
|
||||
|
||||
if(NOT BUILD_SHARED_LIBS)
|
||||
install(TARGETS ${JASPER_LIBRARY} ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT main)
|
||||
endif()
|
||||
|
||||
|
||||
@@ -4,24 +4,17 @@
|
||||
# ----------------------------------------------------------------------------
|
||||
project(${JPEG_LIBRARY})
|
||||
|
||||
# List of C++ files:
|
||||
|
||||
ocv_include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
# The .cpp files:
|
||||
file(GLOB lib_srcs *.c)
|
||||
file(GLOB lib_hdrs *.h)
|
||||
|
||||
# ----------------------------------------------------------------------------------
|
||||
# Define the library target:
|
||||
# Define the library target:
|
||||
# ----------------------------------------------------------------------------------
|
||||
|
||||
add_library(${JPEG_LIBRARY} STATIC ${lib_srcs} ${lib_hdrs})
|
||||
|
||||
if(MSVC)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
|
||||
endif()
|
||||
|
||||
if(UNIX)
|
||||
if(CMAKE_COMPILER_IS_GNUCXX OR CV_ICC)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
|
||||
@@ -32,16 +25,18 @@ if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
set_source_files_properties(jcdctmgr.c PROPERTIES COMPILE_FLAGS "-O1")
|
||||
endif()
|
||||
|
||||
ocv_warnings_disable(CMAKE_C_FLAGS -Wcast-align -Wshadow -Wunused)
|
||||
|
||||
set_target_properties(${JPEG_LIBRARY}
|
||||
PROPERTIES OUTPUT_NAME ${JPEG_LIBRARY}
|
||||
DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}"
|
||||
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/3rdparty/${OPENCV_LIB_INSTALL_PATH}
|
||||
)
|
||||
|
||||
PROPERTIES OUTPUT_NAME ${JPEG_LIBRARY}
|
||||
DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}"
|
||||
ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH}
|
||||
)
|
||||
|
||||
if(ENABLE_SOLUTION_FOLDERS)
|
||||
set_target_properties(${JPEG_LIBRARY} PROPERTIES FOLDER "3rdparty")
|
||||
endif()
|
||||
|
||||
if(NOT BUILD_SHARED_LIBS)
|
||||
install(TARGETS ${JPEG_LIBRARY} ARCHIVE DESTINATION share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH} COMPONENT main)
|
||||
endif()
|
||||
|
||||
if(NOT BUILD_SHARED_LIBS)
|
||||
install(TARGETS ${JPEG_LIBRARY} ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT main)
|
||||
endif()
|
||||
|
||||
@@ -4,39 +4,35 @@
|
||||
# ----------------------------------------------------------------------------
|
||||
project(${PNG_LIBRARY})
|
||||
|
||||
# List of C++ files:
|
||||
|
||||
ocv_include_directories("${CMAKE_CURRENT_SOURCE_DIR}" ${ZLIB_INCLUDE_DIR})
|
||||
|
||||
file(GLOB lib_srcs *.c)
|
||||
file(GLOB lib_hdrs *.h)
|
||||
|
||||
# ----------------------------------------------------------------------------------
|
||||
# Define the library target:
|
||||
# Define the library target:
|
||||
# ----------------------------------------------------------------------------------
|
||||
|
||||
add_library(${PNG_LIBRARY} STATIC ${lib_srcs} ${lib_hdrs})
|
||||
|
||||
if(MSVC)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
|
||||
endif()
|
||||
|
||||
if(UNIX)
|
||||
if(CMAKE_COMPILER_IS_GNUCXX OR CV_ICC)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
ocv_warnings_disable(CMAKE_C_FLAGS -Wcast-align)
|
||||
|
||||
set_target_properties(${PNG_LIBRARY}
|
||||
PROPERTIES OUTPUT_NAME ${PNG_LIBRARY}
|
||||
DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}"
|
||||
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/3rdparty/${OPENCV_LIB_INSTALL_PATH}"
|
||||
)
|
||||
|
||||
PROPERTIES OUTPUT_NAME ${PNG_LIBRARY}
|
||||
DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}"
|
||||
ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH}
|
||||
)
|
||||
|
||||
if(ENABLE_SOLUTION_FOLDERS)
|
||||
set_target_properties(${PNG_LIBRARY} PROPERTIES FOLDER "3rdparty")
|
||||
endif()
|
||||
|
||||
|
||||
if(NOT BUILD_SHARED_LIBS)
|
||||
install(TARGETS ${PNG_LIBRARY} ARCHIVE DESTINATION share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH} COMPONENT main)
|
||||
install(TARGETS ${PNG_LIBRARY} ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT main)
|
||||
endif()
|
||||
|
||||
@@ -26,7 +26,6 @@ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/tif_config.h.cmakein"
|
||||
|
||||
ocv_include_directories("${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" ${ZLIB_INCLUDE_DIR})
|
||||
|
||||
# List of C++ files:
|
||||
set(lib_srcs
|
||||
tif_aux.c
|
||||
tif_close.c
|
||||
@@ -82,19 +81,15 @@ set(lib_srcs
|
||||
|
||||
if(UNIX)
|
||||
list(APPEND lib_srcs tif_unix.c)
|
||||
if(CMAKE_COMPILER_IS_GNUCXX AND NOT ENABLE_NOISY_WARNINGS)
|
||||
set_source_files_properties(tif_unix.c PROPERTIES COMPILE_FLAGS "-w")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
list(APPEND lib_srcs tif_win32.c)
|
||||
endif(WIN32)
|
||||
|
||||
if(MSVC AND NOT ENABLE_NOISY_WARNINGS)
|
||||
string(REPLACE "/W4" "/W0" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
|
||||
string(REPLACE "/W4" "/W0" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||
endif()
|
||||
ocv_warnings_disable(CMAKE_C_FLAGS -Wno-unused-but-set-variable -Wmissing-prototypes -Wmissing-declarations -Wundef -Wunused -Wsign-compare
|
||||
-Wcast-align -Wshadow -Wno-maybe-uninitialized -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast)
|
||||
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wmissing-declarations -Wunused-parameter /wd4100 /wd4244 /wd4706 /wd4127 /wd4701 /wd4018 /wd4267 /wd4306 /wd4305 /wd4312 /wd4311)
|
||||
|
||||
if(UNIX AND (CMAKE_COMPILER_IS_GNUCXX OR CV_ICC))
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
|
||||
@@ -104,16 +99,16 @@ add_library(${TIFF_LIBRARY} STATIC ${lib_srcs})
|
||||
target_link_libraries(${TIFF_LIBRARY} ${ZLIB_LIBRARIES})
|
||||
|
||||
set_target_properties(${TIFF_LIBRARY}
|
||||
PROPERTIES
|
||||
OUTPUT_NAME "${TIFF_LIBRARY}"
|
||||
DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}"
|
||||
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/3rdparty/${OPENCV_LIB_INSTALL_PATH}"
|
||||
)
|
||||
|
||||
PROPERTIES
|
||||
OUTPUT_NAME "${TIFF_LIBRARY}"
|
||||
DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}"
|
||||
ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH}
|
||||
)
|
||||
|
||||
if(ENABLE_SOLUTION_FOLDERS)
|
||||
set_target_properties(${TIFF_LIBRARY} PROPERTIES FOLDER "3rdparty")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT BUILD_SHARED_LIBS)
|
||||
install(TARGETS ${TIFF_LIBRARY} ARCHIVE DESTINATION share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH} COMPONENT main)
|
||||
install(TARGETS ${TIFF_LIBRARY} ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT main)
|
||||
endif()
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
|
||||
/* Signed 64-bit type formatter */
|
||||
/* Unsigned 64-bit type formatter */
|
||||
#ifdef _MSC_VER
|
||||
#if defined _MSC_VER || defined __MINGW__ || defined __MINGW32__
|
||||
# define TIFF_UINT64_FORMAT "%I64u"
|
||||
# define TIFF_SSIZE_FORMAT "%Iu"
|
||||
#else
|
||||
|
||||
@@ -5,20 +5,31 @@ endif()
|
||||
|
||||
project(tbb)
|
||||
|
||||
# 4.0 update 4 - works fine
|
||||
set(tbb_ver "tbb40_20120408oss")
|
||||
set(tbb_url "http://threadingbuildingblocks.org/uploads/77/185/4.0%20update%204/tbb40_20120408oss_src.tgz")
|
||||
set(tbb_md5 "734b356da7fe0ed308741f3e6018251e")
|
||||
set(tbb_version_file "version_string.ver")
|
||||
|
||||
# 4.0 update 3 - build broken
|
||||
#set(tbb_ver "tbb40_20120201oss")
|
||||
#set(tbb_url "http://threadingbuildingblocks.org/uploads/77/182/4.0%20update%203/tbb40_20120201oss_src.tgz")
|
||||
#set(tbb_md5 "4669e7d4adee018de7a7b8b972987218")
|
||||
#set(tbb_version_file "version_string.tmp")
|
||||
|
||||
# 4.0 update 2 - works fine
|
||||
set(tbb_ver "tbb40_20111130oss")
|
||||
set(tbb_url "http://threadingbuildingblocks.org/uploads/77/180/4.0%20update%202/tbb40_20111130oss_src.tgz")
|
||||
set(tbb_md5 "1e6926b21e865e79772119cd44fc3ad8")
|
||||
#set(tbb_ver "tbb40_20111130oss")
|
||||
#set(tbb_url "http://threadingbuildingblocks.org/uploads/77/180/4.0%20update%202/tbb40_20111130oss_src.tgz")
|
||||
#set(tbb_md5 "1e6926b21e865e79772119cd44fc3ad8")
|
||||
#set(tbb_version_file "version_string.tmp")
|
||||
#set(tbb_need_GENERIC_DWORD_LOAD_STORE TRUE)
|
||||
|
||||
# 4.0 update 1 - works fine
|
||||
#set(tbb_ver "tbb40_20111003oss")
|
||||
#set(tbb_url "http://threadingbuildingblocks.org/uploads/77/177/4.0%20update%201/tbb40_20111003oss_src.tgz")
|
||||
#set(tbb_md5 "7b5d94eb35a563b29ef402e0fd8f15c9")
|
||||
#set(tbb_version_file "version_string.tmp")
|
||||
#set(tbb_need_GENERIC_DWORD_LOAD_STORE TRUE)
|
||||
|
||||
set(tbb_tarball "${CMAKE_CURRENT_SOURCE_DIR}/${tbb_ver}_src.tgz")
|
||||
set(tbb_src_dir "${CMAKE_CURRENT_BINARY_DIR}/${tbb_ver}")
|
||||
@@ -61,7 +72,7 @@ if(NOT EXISTS "${tbb_tarball}")
|
||||
file(REMOVE "${tbb_tarball}")
|
||||
message(FATAL_ERROR "Downloaded TBB source tarball has invalid MD5 hash: ${tbb_local_md5} (expected: ${tbb_md5})")
|
||||
endif()
|
||||
|
||||
|
||||
if(EXISTS "${tbb_src_dir}")
|
||||
file(REMOVE_RECURSE "${tbb_src_dir}")
|
||||
endif()
|
||||
@@ -92,32 +103,40 @@ list(APPEND lib_srcs "${tbb_src_dir}/src/rml/client/rml_tbb.cpp")
|
||||
|
||||
add_definitions(-D__TBB_DYNAMIC_LOAD_ENABLED=0 #required
|
||||
-D__TBB_BUILD=1 #required
|
||||
-D__TBB_SURVIVE_THREAD_SWITCH=0 #no cilk on Android
|
||||
-D__TBB_USE_GENERIC_DWORD_LOAD_STORE=1 #needed by TBB 4.0 update 1,2; fixed in TBB 4.0 update 3 but it has 2 new problems
|
||||
-D__TBB_SURVIVE_THREAD_SWITCH=0 #no cilk on Android ?
|
||||
-DUSE_PTHREAD #required
|
||||
-DTBB_USE_GCC_BUILTINS=1 #required
|
||||
-DTBB_USE_DEBUG=0 #just ot be sure
|
||||
-DTBB_USE_DEBUG=0 #just to be sure
|
||||
-DTBB_NO_LEGACY=1 #don't need backward compatibility
|
||||
-DDO_ITT_NOTIFY=0 #it seems that we don't need these notifications
|
||||
)
|
||||
|
||||
add_library(tbb STATIC ${lib_srcs} ${lib_hdrs} "${CMAKE_CURRENT_SOURCE_DIR}/android_additional.h" "${CMAKE_CURRENT_SOURCE_DIR}/version_string.tmp")
|
||||
if(tbb_need_GENERIC_DWORD_LOAD_STORE)
|
||||
#needed by TBB 4.0 update 1,2; fixed in TBB 4.0 update 3 but it has 2 new problems
|
||||
add_definitions(-D__TBB_USE_GENERIC_DWORD_LOAD_STORE=1)
|
||||
set(tbb_need_GENERIC_DWORD_LOAD_STORE ON PARENT_SCOPE)
|
||||
endif()
|
||||
|
||||
add_library(tbb STATIC ${lib_srcs} ${lib_hdrs} "${CMAKE_CURRENT_SOURCE_DIR}/android_additional.h" "${CMAKE_CURRENT_SOURCE_DIR}/${tbb_version_file}")
|
||||
target_link_libraries(tbb c m dl)
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w -include \"${CMAKE_CURRENT_SOURCE_DIR}/android_additional.h\"")
|
||||
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wmissing-declarations)
|
||||
string(REPLACE "-Werror=non-virtual-dtor" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include \"${CMAKE_CURRENT_SOURCE_DIR}/android_additional.h\"")
|
||||
|
||||
set_target_properties(tbb
|
||||
PROPERTIES OUTPUT_NAME tbb
|
||||
DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}"
|
||||
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/3rdparty/${OPENCV_LIB_INSTALL_PATH}"
|
||||
)
|
||||
|
||||
PROPERTIES OUTPUT_NAME tbb
|
||||
DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}"
|
||||
ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH}
|
||||
)
|
||||
|
||||
if(ENABLE_SOLUTION_FOLDERS)
|
||||
set_target_properties(tbb PROPERTIES FOLDER "3rdparty")
|
||||
endif()
|
||||
|
||||
|
||||
if(NOT BUILD_SHARED_LIBS)
|
||||
install(TARGETS tbb ARCHIVE DESTINATION share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH} COMPONENT main)
|
||||
install(TARGETS tbb ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT main)
|
||||
endif()
|
||||
|
||||
# get TBB version
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
#define __TBB_VERSION_STRINGS \
|
||||
"TBB: BUILD_HOST buit as part of OpenCV" ENDL \
|
||||
"TBB: BUILD_OS crosscompiling" ENDL \
|
||||
"TBB: BUILD_KERNEL UNKNOWN" ENDL \
|
||||
"TBB: BUILD_HOST Unknown" ENDL \
|
||||
"TBB: BUILD_OS Android" ENDL \
|
||||
"TBB: BUILD_KERNEL Unknown" ENDL \
|
||||
"TBB: BUILD_GCC gcc version 4.4.3" ENDL \
|
||||
"TBB: BUILD_GLIBC 2.11.1" ENDL \
|
||||
"TBB: BUILD_LD " ENDL \
|
||||
"TBB: BUILD_TARGET on " ENDL \
|
||||
"TBB: BUILD_COMMAND TBD" ENDL \
|
||||
|
||||
#define __TBB_DATETIME "Sun Jan 01 00:00:01 UTC 2012"
|
||||
"TBB: BUILD_GLIBC Unknown" ENDL \
|
||||
"TBB: BUILD_LD Unknown" ENDL \
|
||||
"TBB: BUILD_TARGET Unknown" ENDL \
|
||||
"TBB: BUILD_COMMAND use cv::getBuildInformation() for details" ENDL
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
#define __TBB_VERSION_STRINGS(N) \
|
||||
#N": BUILD_HOST Unknown" ENDL \
|
||||
#N": BUILD_OS Android" ENDL \
|
||||
#N": BUILD_KERNEL Unknown" ENDL \
|
||||
#N": BUILD_GCC gcc version 4.4.3" ENDL \
|
||||
#N": BUILD_GLIBC Unknown" ENDL \
|
||||
#N": BUILD_LD Unknown" ENDL \
|
||||
#N": BUILD_TARGET Unknown" ENDL \
|
||||
#N": BUILD_COMMAND use cv::getBuildInformation() for details" ENDL
|
||||
@@ -5,18 +5,10 @@
|
||||
|
||||
project(${ZLIB_LIBRARY} C)
|
||||
|
||||
include(CheckTypeSize)
|
||||
include(CheckFunctionExists)
|
||||
include(CheckIncludeFile)
|
||||
include(CheckCSourceCompiles)
|
||||
|
||||
#
|
||||
# Check to see if we have large file support
|
||||
#
|
||||
check_type_size(off64_t OFF64_T)
|
||||
if(HAVE_OFF64_T)
|
||||
add_definitions(-D_LARGEFILE64_SOURCE=1)
|
||||
endif()
|
||||
include(CheckTypeSize)
|
||||
|
||||
#
|
||||
# Check for fseeko
|
||||
@@ -36,6 +28,14 @@ if(MSVC)
|
||||
add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
|
||||
endif()
|
||||
|
||||
#
|
||||
# Check to see if we have large file support
|
||||
#
|
||||
check_type_size(off64_t OFF64_T)
|
||||
if(HAVE_OFF64_T)
|
||||
add_definitions(-D_LARGEFILE64_SOURCE=1)
|
||||
endif()
|
||||
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.cmakein"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/zconf.h" @ONLY)
|
||||
ocv_include_directories("${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}")
|
||||
@@ -82,22 +82,20 @@ if(UNIX)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(MSVC AND NOT ENABLE_NOISY_WARNINGS)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4013")
|
||||
endif()
|
||||
ocv_warnings_disable(CMAKE_C_FLAGS /wd4013 -Wattributes -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations)
|
||||
|
||||
set_target_properties(${ZLIB_LIBRARY} PROPERTIES
|
||||
OUTPUT_NAME ${ZLIB_LIBRARY}
|
||||
DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}"
|
||||
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/3rdparty/${OPENCV_LIB_INSTALL_PATH}"
|
||||
ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH}
|
||||
)
|
||||
|
||||
if(ENABLE_SOLUTION_FOLDERS)
|
||||
set_target_properties(${ZLIB_LIBRARY} PROPERTIES FOLDER "3rdparty")
|
||||
endif()
|
||||
|
||||
|
||||
if(NOT BUILD_SHARED_LIBS)
|
||||
install(TARGETS ${ZLIB_LIBRARY} ARCHIVE DESTINATION share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH} COMPONENT main)
|
||||
install(TARGETS ${ZLIB_LIBRARY} ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT main)
|
||||
endif()
|
||||
|
||||
ocv_parse_header2(ZLIB "${CMAKE_CURRENT_SOURCE_DIR}/zlib.h" ZLIB_VERSION PARENT_SCOPE)
|
||||
|
||||
@@ -410,10 +410,18 @@ typedef uLong FAR uLongf;
|
||||
* both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as
|
||||
* equivalently requesting no 64-bit operations
|
||||
*/
|
||||
#if -_LARGEFILE64_SOURCE - -1 == 1
|
||||
#if defined _LARGEFILE64_SOURCE && -_LARGEFILE64_SOURCE - -1 == 1
|
||||
# undef _LARGEFILE64_SOURCE
|
||||
#endif
|
||||
|
||||
#ifndef _LFS64_LARGEFILE
|
||||
# define _LFS64_LARGEFILE 0
|
||||
#endif
|
||||
|
||||
#ifndef _FILE_OFFSET_BITS
|
||||
# define _FILE_OFFSET_BITS 0
|
||||
#endif
|
||||
|
||||
#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
|
||||
# define Z_LARGE
|
||||
#endif
|
||||
|
||||
@@ -37,6 +37,8 @@ if(NOT CMAKE_TOOLCHAIN_FILE)
|
||||
else(NOT CMAKE_TOOLCHAIN_FILE)
|
||||
#Android: set output folder to ${CMAKE_BINARY_DIR}
|
||||
set( LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_BINARY_DIR} CACHE PATH "root for library output, set this to change where android libs are compiled to" )
|
||||
# any crosscompiling
|
||||
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Installation Directory")
|
||||
endif(NOT CMAKE_TOOLCHAIN_FILE)
|
||||
|
||||
# --------------------------------------------------------------
|
||||
@@ -50,6 +52,7 @@ else()
|
||||
cmake_minimum_required(VERSION 2.6.3)
|
||||
endif()
|
||||
|
||||
# must go before the project command
|
||||
set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configs" FORCE)
|
||||
if(DEFINED CMAKE_BUILD_TYPE AND CMAKE_VERSION VERSION_GREATER "2.8")
|
||||
set_property( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${CMAKE_CONFIGURATION_TYPES} )
|
||||
@@ -59,6 +62,14 @@ project(OpenCV CXX C)
|
||||
|
||||
include(cmake/OpenCVUtils.cmake REQUIRED)
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Break in case of popular CMake configuration mistakes
|
||||
# ----------------------------------------------------------------------------
|
||||
if(NOT CMAKE_SIZEOF_VOID_P GREATER 0)
|
||||
message(FATAL_ERROR "CMake fails to deterimine the bitness of target platform.
|
||||
Please check your CMake and compiler installation. If you are crosscompiling then ensure that your CMake toolchain file correctly sets the compiler details.")
|
||||
endif()
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Detect compiler and target platform architecture
|
||||
# ----------------------------------------------------------------------------
|
||||
@@ -107,24 +118,25 @@ OCV_OPTION(WITH_CUDA "Include NVidia Cuda Runtime support" ON
|
||||
OCV_OPTION(WITH_CUFFT "Include NVidia Cuda Fast Fourier Transform (FFT) library support" ON IF (CMAKE_VERSION VERSION_GREATER "2.8" AND NOT ANDROID AND NOT IOS) )
|
||||
OCV_OPTION(WITH_EIGEN "Include Eigen2/Eigen3 support" ON)
|
||||
OCV_OPTION(WITH_FFMPEG "Include FFMPEG support" ON IF (NOT ANDROID AND NOT IOS) )
|
||||
OCV_OPTION(WITH_GSTREAMER "Include Gstreamer support" ON IF (UNIX AND NOT APPLE AND NOT ANDROID AND NOT IOS) )
|
||||
OCV_OPTION(WITH_GTK "Include GTK support" ON IF (UNIX AND NOT APPLE AND NOT ANDROID AND NOT IOS) )
|
||||
OCV_OPTION(WITH_GSTREAMER "Include Gstreamer support" ON IF (UNIX AND NOT APPLE AND NOT ANDROID) )
|
||||
OCV_OPTION(WITH_GTK "Include GTK support" ON IF (UNIX AND NOT APPLE AND NOT ANDROID) )
|
||||
OCV_OPTION(WITH_IMAGEIO "ImageIO support for OS X" OFF IF APPLE)
|
||||
OCV_OPTION(WITH_IPP "Include Intel IPP support" OFF IF (MSVC OR X86 OR X86_64) )
|
||||
OCV_OPTION(WITH_JASPER "Include JPEG2K support" ON IF (NOT IOS) )
|
||||
OCV_OPTION(WITH_JPEG "Include JPEG support" ON IF (NOT IOS) )
|
||||
OCV_OPTION(WITH_OPENEXR "Include ILM support via OpenEXR" ON IF (NOT IOS) )
|
||||
OCV_OPTION(WITH_OPENGL "Include OpenGL support" OFF IF (NOT ANDROID AND NOT IOS) )
|
||||
OCV_OPTION(WITH_OPENGL "Include OpenGL support" OFF IF (NOT ANDROID AND NOT APPLE) )
|
||||
OCV_OPTION(WITH_OPENNI "Include OpenNI support" OFF IF (NOT ANDROID AND NOT IOS) )
|
||||
OCV_OPTION(WITH_PNG "Include PNG support" ON IF (NOT IOS) )
|
||||
OCV_OPTION(WITH_PVAPI "Include Prosilica GigE support" ON IF (UNIX AND NOT ANDROID AND NOT IOS) )
|
||||
OCV_OPTION(WITH_PVAPI "Include Prosilica GigE support" ON IF (NOT ANDROID AND NOT IOS) )
|
||||
OCV_OPTION(WITH_QT "Build with Qt Backend support" OFF IF (NOT ANDROID AND NOT IOS) )
|
||||
OCV_OPTION(WITH_QUICKTIME "Use QuickTime for Video I/O insted of QTKit" OFF IF APPLE )
|
||||
OCV_OPTION(WITH_TBB "Include Intel TBB support" OFF IF (NOT IOS) )
|
||||
OCV_OPTION(WITH_TIFF "Include TIFF support" ON IF (NOT IOS) )
|
||||
OCV_OPTION(WITH_UNICAP "Include Unicap support (GPL)" OFF IF (UNIX AND NOT APPLE AND NOT ANDROID AND NOT IOS) )
|
||||
OCV_OPTION(WITH_V4L "Include Video 4 Linux support" ON IF (UNIX AND NOT APPLE AND NOT ANDROID AND NOT IOS) )
|
||||
OCV_OPTION(WITH_UNICAP "Include Unicap support (GPL)" OFF IF (UNIX AND NOT APPLE AND NOT ANDROID) )
|
||||
OCV_OPTION(WITH_V4L "Include Video 4 Linux support" ON IF (UNIX AND NOT APPLE AND NOT ANDROID) )
|
||||
OCV_OPTION(WITH_VIDEOINPUT "Build HighGUI with DirectShow support" ON IF WIN32 )
|
||||
OCV_OPTION(WITH_XIMEA "Include XIMEA cameras support" OFF IF WIN32 )
|
||||
OCV_OPTION(WITH_XIMEA "Include XIMEA cameras support" OFF IF (NOT ANDROID AND NOT APPLE) )
|
||||
OCV_OPTION(WITH_XINE "Include Xine support (GPL)" OFF IF (UNIX AND NOT APPLE AND NOT ANDROID AND NOT IOS) )
|
||||
|
||||
# OpenCV build components
|
||||
@@ -139,6 +151,9 @@ OCV_OPTION(BUILD_TESTS "Build accuracy & regression tests"
|
||||
OCV_OPTION(BUILD_WITH_DEBUG_INFO "Include debug info into debug libs (not MSCV only)" ON )
|
||||
OCV_OPTION(BUILD_WITH_STATIC_CRT "Enables use of staticaly linked CRT for staticaly linked OpenCV" ON IF MSVC )
|
||||
OCV_OPTION(BUILD_FAT_JAVA_LIB "Create fat java wrapper containing the whole OpenCV library" ON IF ANDROID AND NOT BUILD_SHARED_LIBS AND CMAKE_COMPILER_IS_GNUCXX )
|
||||
OCV_OPTION(BUILD_ANDROID_SERVICE "Build OpenCV Manager for Google Play" OFF IF ANDROID AND ANDROID_USE_STLPORT AND ANDROID_SOURCE_TREE )
|
||||
OCV_OPTION(BUILD_ANDROID_PACKAGE "Build platform-specific package for Google Play" OFF IF ANDROID )
|
||||
|
||||
|
||||
# 3rd party libs
|
||||
OCV_OPTION(BUILD_ZLIB "Build zlib from source" WIN32 OR IOS OR APPLE )
|
||||
@@ -154,10 +169,17 @@ OCV_OPTION(INSTALL_PYTHON_EXAMPLES "Install Python examples" OFF )
|
||||
OCV_OPTION(INSTALL_ANDROID_EXAMPLES "Install Android examples" OFF IF ANDROID )
|
||||
OCV_OPTION(INSTALL_TO_MANGLED_PATHS "Enables mangled install paths, that help with side by side installs." OFF IF (UNIX AND NOT ANDROID AND NOT IOS AND BUILD_SHARED_LIBS) )
|
||||
|
||||
|
||||
if(MSVC_IDE OR CMAKE_GENERATOR MATCHES Xcode)
|
||||
set(ENABLE_SOLUTION_FOLDERS0 ON)
|
||||
else()
|
||||
set(ENABLE_SOLUTION_FOLDERS0 OFF)
|
||||
endif()
|
||||
|
||||
# OpenCV build options
|
||||
# ===================================================
|
||||
OCV_OPTION(ENABLE_PRECOMPILED_HEADERS "Use precompiled headers" ON IF (NOT IOS) )
|
||||
OCV_OPTION(ENABLE_SOLUTION_FOLDERS "Solution folder in Visual Studio or in other IDEs" MSVC_IDE IF (CMAKE_VERSION VERSION_GREATER "2.8.0") )
|
||||
OCV_OPTION(ENABLE_SOLUTION_FOLDERS "Solution folder in Visual Studio or in other IDEs" ${ENABLE_SOLUTION_FOLDERS0} IF (CMAKE_VERSION VERSION_GREATER "2.8.0") )
|
||||
OCV_OPTION(ENABLE_PROFILING "Enable profiling in the GCC compiler (Add flags: -g -pg)" OFF IF CMAKE_COMPILER_IS_GNUCXX )
|
||||
OCV_OPTION(ENABLE_OMIT_FRAME_POINTER "Enable -fomit-frame-pointer for GCC" ON IF CMAKE_COMPILER_IS_GNUCXX )
|
||||
OCV_OPTION(ENABLE_POWERPC "Enable PowerPC for GCC" ON IF (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_SYSTEM_PROCESSOR MATCHES powerpc.*) )
|
||||
@@ -171,6 +193,8 @@ OCV_OPTION(ENABLE_SSE42 "Enable SSE4.2 instructions"
|
||||
OCV_OPTION(ENABLE_NOISY_WARNINGS "Show all warnings even if they are too noisy" OFF )
|
||||
OCV_OPTION(OPENCV_WARNINGS_ARE_ERRORS "Treat warnings as errors" OFF )
|
||||
|
||||
OCV_OPTION(OPENCV_CAN_BREAK_BINARY_COMPATIBILITY "Allow changes breaking binary compatibility with OpenCV 2.4.0" OFF )
|
||||
|
||||
# uncategorized options
|
||||
# ===================================================
|
||||
OCV_OPTION(CMAKE_VERBOSE "Verbose mode" OFF )
|
||||
@@ -191,7 +215,6 @@ include(cmake/OpenCVVersion.cmake REQUIRED)
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# Save libs and executables in the same place
|
||||
set(LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/lib" CACHE PATH "Output directory for libraries" )
|
||||
set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/bin" CACHE PATH "Output directory for applications" )
|
||||
|
||||
if(ANDROID OR WIN32)
|
||||
@@ -203,17 +226,32 @@ else()
|
||||
endif()
|
||||
|
||||
if(ANDROID)
|
||||
set(OPENCV_LIB_INSTALL_PATH libs/${ANDROID_NDK_ABI_NAME})
|
||||
set(LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/lib/${ANDROID_NDK_ABI_NAME}")
|
||||
set(3P_LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/3rdparty/lib/${ANDROID_NDK_ABI_NAME}")
|
||||
set(OPENCV_LIB_INSTALL_PATH sdk/native/libs/${ANDROID_NDK_ABI_NAME})
|
||||
set(OPENCV_3P_LIB_INSTALL_PATH sdk/native/3rdparty/libs/${ANDROID_NDK_ABI_NAME})
|
||||
set(OPENCV_CONFIG_INSTALL_PATH sdk/native/jni)
|
||||
set(OPENCV_INCLUDE_INSTALL_PATH sdk/native/jni/include)
|
||||
else()
|
||||
set(OPENCV_LIB_INSTALL_PATH lib${LIB_SUFFIX})
|
||||
set(LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/lib")
|
||||
set(3P_LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/3rdparty/lib${LIB_SUFFIX}")
|
||||
set(OPENCV_LIB_INSTALL_PATH lib${LIB_SUFFIX})
|
||||
set(OPENCV_3P_LIB_INSTALL_PATH share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH})
|
||||
set(OPENCV_INCLUDE_INSTALL_PATH include)
|
||||
|
||||
math(EXPR SIZEOF_VOID_P_BITS "8 * ${CMAKE_SIZEOF_VOID_P}")
|
||||
if(LIB_SUFFIX AND NOT SIZEOF_VOID_P_BITS EQUAL LIB_SUFFIX)
|
||||
set(OPENCV_CONFIG_INSTALL_PATH lib${LIB_SUFFIX}/cmake/opencv)
|
||||
else()
|
||||
set(OPENCV_CONFIG_INSTALL_PATH share/OpenCV)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${OPENCV_LIB_INSTALL_PATH}")
|
||||
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
||||
|
||||
set(OPENCV_INCLUDE_PREFIX include)
|
||||
if(INSTALL_TO_MANGLED_PATHS)
|
||||
set(OPENCV_INCLUDE_PREFIX include/opencv-${OPENCV_VERSION})
|
||||
set(OPENCV_INCLUDE_INSTALL_PATH ${OPENCV_INCLUDE_INSTALL_PATH}/opencv-${OPENCV_VERSION})
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
@@ -269,13 +307,13 @@ endif()
|
||||
# ----------------------------------------------------------------------------
|
||||
# OpenCV compiler and linker options
|
||||
# ----------------------------------------------------------------------------
|
||||
include(cmake/OpenCVCompilerOptions.cmake REQUIRED)
|
||||
|
||||
# In case of Makefiles if the user does not setup CMAKE_BUILD_TYPE, assume it's Release:
|
||||
if(CMAKE_GENERATOR MATCHES "Makefiles|Ninja" AND "${CMAKE_BUILD_TYPE}" STREQUAL "")
|
||||
set(CMAKE_BUILD_TYPE Release)
|
||||
endif()
|
||||
|
||||
include(cmake/OpenCVCompilerOptions.cmake REQUIRED)
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Use statically or dynamically linked CRT?
|
||||
@@ -293,190 +331,58 @@ if(UNIX)
|
||||
include(cmake/OpenCVFindPkgConfig.cmake OPTIONAL)
|
||||
include(CheckFunctionExists)
|
||||
include(CheckIncludeFile)
|
||||
|
||||
if(NOT APPLE)
|
||||
CHECK_INCLUDE_FILE(alloca.h HAVE_ALLOCA_H)
|
||||
CHECK_FUNCTION_EXISTS(alloca HAVE_ALLOCA)
|
||||
CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H)
|
||||
CHECK_INCLUDE_FILE(pthread.h HAVE_LIBPTHREAD)
|
||||
if(ANDROID)
|
||||
set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} dl m log)
|
||||
elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD|NetBSD|DragonFly")
|
||||
set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} m pthread)
|
||||
else()
|
||||
set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} dl m pthread rt)
|
||||
endif()
|
||||
else()
|
||||
add_definitions(-DHAVE_ALLOCA -DHAVE_ALLOCA_H -DHAVE_LIBPTHREAD -DHAVE_UNISTD_H)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
include(cmake/OpenCVPCHSupport.cmake REQUIRED)
|
||||
include(cmake/OpenCVModule.cmake REQUIRED)
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Detect 3rd-party tools and libraries
|
||||
# Detect 3rd-party libraries
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# IO libraries
|
||||
include(cmake/OpenCVIOLibs.cmake REQUIRED)
|
||||
include(cmake/OpenCVFindLibsGrfmt.cmake REQUIRED)
|
||||
include(cmake/OpenCVFindLibsGUI.cmake REQUIRED)
|
||||
include(cmake/OpenCVFindLibsVideo.cmake REQUIRED)
|
||||
include(cmake/OpenCVFindLibsPerf.cmake REQUIRED)
|
||||
|
||||
#Graphic libraries
|
||||
set(HAVE_OPENGL 0)
|
||||
if(UNIX)
|
||||
if(NOT APPLE)
|
||||
if(WITH_GTK)
|
||||
CHECK_MODULE(gtk+-2.0 HAVE_GTK)
|
||||
CHECK_MODULE(gthread-2.0 HAVE_GTHREAD)
|
||||
if(WITH_OPENGL)
|
||||
CHECK_MODULE(gtkglext-1.0 HAVE_GTKGLEXT)
|
||||
if(HAVE_GTKGLEXT)
|
||||
find_package(OpenGL QUIET)
|
||||
if(OPENGL_FOUND)
|
||||
set(HAVE_OPENGL 1)
|
||||
set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${OPENGL_LIBRARIES})
|
||||
ocv_include_directories(${OPENGL_INCLUDE_DIR})
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
else()
|
||||
set(HAVE_GTK FALSE)
|
||||
set(HAVE_GTHREAD FALSE)
|
||||
endif()
|
||||
if(WITH_GSTREAMER)
|
||||
CHECK_MODULE(gstreamer-base-0.10 HAVE_GSTREAMER)
|
||||
CHECK_MODULE(gstreamer-app-0.10 HAVE_GSTREAMER)
|
||||
CHECK_MODULE(gstreamer-video-0.10 HAVE_GSTREAMER)
|
||||
else()
|
||||
set(HAVE_GSTREAMER FALSE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_UNICAP)
|
||||
CHECK_MODULE(libunicap HAVE_UNICAP_)
|
||||
CHECK_MODULE(libucil HAVE_UNICAP_UCIL)
|
||||
if(HAVE_UNICAP_ AND HAVE_UNICAP_UCIL)
|
||||
set(HAVE_UNICAP 1)
|
||||
endif()
|
||||
else()
|
||||
set(HAVE_UNICAP FALSE)
|
||||
endif()
|
||||
# ----------------------------------------------------------------------------
|
||||
# Detect other 3rd-party libraries/tools
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
if(WITH_PVAPI)
|
||||
find_path(PVAPI_INCLUDE_PATH "PvApi.h"
|
||||
PATHS "/usr/local/include" "/usr/include"
|
||||
DOC "The path to PvAPI header")
|
||||
if(PVAPI_INCLUDE_PATH)
|
||||
set(HAVE_PVAPI 1)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(HAVE_FFMPEG 0)
|
||||
if(WITH_FFMPEG)
|
||||
CHECK_MODULE(libavcodec HAVE_FFMPEG_CODEC)
|
||||
CHECK_MODULE(libavformat HAVE_FFMPEG_FORMAT)
|
||||
CHECK_MODULE(libavutil HAVE_FFMPEG_UTIL)
|
||||
CHECK_MODULE(libswscale HAVE_FFMPEG_SWSCALE)
|
||||
CHECK_INCLUDE_FILE(libavformat/avformat.h HAVE_GENTOO_FFMPEG)
|
||||
CHECK_INCLUDE_FILE(ffmpeg/avformat.h HAVE_FFMPEG_FFMPEG)
|
||||
if(NOT HAVE_GENTOO_FFMPEG AND NOT HAVE_FFMPEG_FFMPEG)
|
||||
if(EXISTS /usr/include/ffmpeg/libavformat/avformat.h OR HAVE_FFMPEG_SWSCALE)
|
||||
set(HAVE_GENTOO_FFMPEG 1)
|
||||
endif()
|
||||
endif()
|
||||
if(HAVE_FFMPEG_CODEC AND HAVE_FFMPEG_FORMAT AND HAVE_FFMPEG_UTIL)
|
||||
if(HAVE_FFMPEG_SWSCALE)
|
||||
set(HAVE_FFMPEG 1)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Find the bzip2 library because it is required on some systems
|
||||
FIND_LIBRARY(BZIP2_LIBRARIES NAMES bz2 bzip2)
|
||||
if(NOT BZIP2_LIBRARIES)
|
||||
# Do an other trial
|
||||
FIND_FILE(BZIP2_LIBRARIES NAMES libbz2.so.1 PATHS /lib)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_1394)
|
||||
CHECK_MODULE(libdc1394-2 HAVE_DC1394_2)
|
||||
if(NOT HAVE_DC1394_2)
|
||||
CHECK_MODULE(libdc1394 HAVE_DC1394)
|
||||
endif()
|
||||
else()
|
||||
set(HAVE_DC1394_2 FALSE)
|
||||
set(HAVE_DC1394 FALSE)
|
||||
endif()
|
||||
|
||||
if(NOT APPLE)
|
||||
CHECK_INCLUDE_FILE(alloca.h HAVE_ALLOCA_H)
|
||||
CHECK_FUNCTION_EXISTS(alloca HAVE_ALLOCA)
|
||||
CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H)
|
||||
CHECK_INCLUDE_FILE(pthread.h HAVE_LIBPTHREAD)
|
||||
|
||||
if(WITH_XINE)
|
||||
CHECK_MODULE(libxine HAVE_XINE)
|
||||
else()
|
||||
set(HAVE_XINE FALSE)
|
||||
endif()
|
||||
if(WITH_V4L)
|
||||
CHECK_MODULE(libv4l1 HAVE_LIBV4L)
|
||||
CHECK_INCLUDE_FILE(linux/videodev.h HAVE_CAMV4L)
|
||||
CHECK_INCLUDE_FILE(linux/videodev2.h HAVE_CAMV4L2)
|
||||
else()
|
||||
set(HAVE_LIBV4L FALSE)
|
||||
set(HAVE_CAMV4L FALSE)
|
||||
set(HAVE_CAMV4L2 FALSE)
|
||||
endif()
|
||||
|
||||
if(ANDROID)
|
||||
set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} dl m log)
|
||||
elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR ${CMAKE_SYSTEM_NAME} MATCHES "NetBSD")
|
||||
set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} m pthread)
|
||||
else()
|
||||
set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} dl m pthread rt)
|
||||
endif()
|
||||
else()
|
||||
add_definitions(-DHAVE_ALLOCA -DHAVE_ALLOCA_H -DHAVE_LIBPTHREAD -DHAVE_UNISTD_H)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(APPLE AND WITH_FFMPEG)
|
||||
set(FFMPEG_DEFAULT_INCLUDE_DIRS "/usr/local/include/" "/usr/include/" "opt/include/")
|
||||
|
||||
find_path(FFMPEG_INCLUDE_DIR "libavformat/avformat.h" PATHS ${FFMPEG_DEFAULT_INCLUDE_DIRS} DOC "The path to FFMPEG headers")
|
||||
if(FFMPEG_INCLUDE_DIR)
|
||||
set(HAVE_GENTOO_FFMPEG 1)
|
||||
set(FFMPEG_LIB_DIR "${FFMPEG_INCLUDE_DIR}/../lib" CACHE PATH "Full path of FFMPEG library directory")
|
||||
if(EXISTS "${FFMPEG_LIB_DIR}/libavcodec.a")
|
||||
set(HAVE_FFMPEG_CODEC 1)
|
||||
set(ALIASOF_libavcodec_VERSION "Unknown")
|
||||
if(EXISTS "${FFMPEG_LIB_DIR}/libavformat.a")
|
||||
set(HAVE_FFMPEG_FORMAT 1)
|
||||
set(ALIASOF_libavformat_VERSION "Unknown")
|
||||
if(EXISTS "${FFMPEG_LIB_DIR}/libavutil.a")
|
||||
set(HAVE_FFMPEG_UTIL 1)
|
||||
set(ALIASOF_libavutil_VERSION "Unknown")
|
||||
if(EXISTS "${FFMPEG_LIB_DIR}/libswscale.a")
|
||||
ocv_include_directories(${FFMPEG_INCLUDE_DIR})
|
||||
set(HAVE_FFMPEG_SWSCALE 1)
|
||||
set(ALIASOF_libswscale_VERSION "Unknown")
|
||||
set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} "${FFMPEG_LIB_DIR}/libavcodec.a"
|
||||
"${FFMPEG_LIB_DIR}/libavformat.a" "${FFMPEG_LIB_DIR}/libavutil.a"
|
||||
"${FFMPEG_LIB_DIR}/libswscale.a")
|
||||
set(HAVE_FFMPEG 1)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WIN32 AND WITH_FFMPEG)
|
||||
include(3rdparty/ffmpeg/ffmpeg_version.cmake REQUIRED)
|
||||
endif()
|
||||
|
||||
#################### LATEX for dpf documentation ##################
|
||||
# --- LATEX for pdf documentation ---
|
||||
if(BUILD_DOCS)
|
||||
include(cmake/OpenCVFindLATEX.cmake REQUIRED)
|
||||
endif()
|
||||
endif(BUILD_DOCS)
|
||||
|
||||
########################## Python Support #########################
|
||||
# --- Python Support ---
|
||||
include(cmake/OpenCVDetectPython.cmake REQUIRED)
|
||||
|
||||
########################### Java Support ##########################
|
||||
# --- Java Support ---
|
||||
if(ANDROID)
|
||||
include(cmake/OpenCVDetectApacheAnt.cmake REQUIRED)
|
||||
include(cmake/OpenCVDetectAndroidSDK.cmake REQUIRED)
|
||||
|
||||
|
||||
if(NOT ANDROID_TOOLS_Pkg_Revision GREATER 13)
|
||||
message(WARNING "OpenCV requires Android SDK tools revision 14 or newer. Otherwise tests and samples will no be compiled.")
|
||||
endif()
|
||||
endif()
|
||||
endif(ANDROID)
|
||||
|
||||
if(ANDROID AND ANDROID_EXECUTABLE AND ANT_EXECUTABLE AND (ANT_VERSION VERSION_GREATER 1.7) AND (ANDROID_TOOLS_Pkg_Revision GREATER 13))
|
||||
SET(CAN_BUILD_ANDROID_PROJECTS TRUE)
|
||||
@@ -484,115 +390,6 @@ else()
|
||||
SET(CAN_BUILD_ANDROID_PROJECTS FALSE)
|
||||
endif()
|
||||
|
||||
############################### QT ################################
|
||||
set(HAVE_QT 0)
|
||||
set(HAVE_QT_OPENGL 0)
|
||||
|
||||
if(WITH_QT)
|
||||
find_package(Qt4)
|
||||
if(QT4_FOUND)
|
||||
set(HAVE_QT 1)
|
||||
add_definitions(-DHAVE_QT) #We need to define te macro this way, using cvconfig.h.cmake does not work
|
||||
|
||||
if(WITH_OPENGL)
|
||||
find_package (OpenGL QUIET)
|
||||
if(QT_QTOPENGL_FOUND AND OPENGL_FOUND)
|
||||
set(HAVE_OPENGL 1)
|
||||
set(HAVE_QT_OPENGL 1)
|
||||
add_definitions(-DHAVE_QT_OPENGL)
|
||||
set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${OPENGL_LIBRARIES})
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
############################### TBB ################################
|
||||
if(WITH_TBB)
|
||||
include(cmake/OpenCVDetectTBB.cmake REQUIRED)
|
||||
endif()
|
||||
|
||||
############################ Intel IPP #############################
|
||||
set(IPP_FOUND)
|
||||
|
||||
if(WITH_IPP)
|
||||
include(cmake/OpenCVFindIPP.cmake)
|
||||
endif()
|
||||
|
||||
if(IPP_FOUND)
|
||||
add_definitions(-DHAVE_IPP)
|
||||
ocv_include_directories(${IPP_INCLUDE_DIRS})
|
||||
link_directories(${IPP_LIBRARY_DIRS})
|
||||
set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${IPP_LIBRARIES})
|
||||
endif()
|
||||
|
||||
############################### CUDA ################################
|
||||
if(WITH_CUDA)
|
||||
include(cmake/OpenCVDetectCUDA.cmake REQUIRED)
|
||||
endif()
|
||||
|
||||
############################### OpenNI ################################
|
||||
set(HAVE_OPENNI FALSE)
|
||||
set(HAVE_OPENNI_PRIME_SENSOR_MODULE FALSE)
|
||||
|
||||
if(WITH_OPENNI)
|
||||
include(cmake/OpenCVFindOpenNI.cmake)
|
||||
endif()
|
||||
|
||||
############################### XIMEA ################################
|
||||
set(HAVE_XIMEA FALSE)
|
||||
|
||||
if(WITH_XIMEA)
|
||||
include(cmake/OpenCVFindXimea.cmake)
|
||||
endif()
|
||||
|
||||
if(XIMEA_FOUND)
|
||||
set(HAVE_XIMEA TRUE)
|
||||
endif()
|
||||
|
||||
############################## Eigen ##############################
|
||||
if(WITH_EIGEN)
|
||||
find_path(EIGEN_INCLUDE_PATH "Eigen/Core"
|
||||
PATHS "/usr/local/include/eigen2" "/opt/include/eigen2" "/usr/include/eigen2"
|
||||
"/usr/local/include/eigen3" "/opt/include/eigen3" "/usr/include/eigen3"
|
||||
DOC "The path to Eigen2/Eigen3 headers")
|
||||
if(EIGEN_INCLUDE_PATH)
|
||||
ocv_include_directories(${EIGEN_INCLUDE_PATH})
|
||||
ocv_parse_header("${EIGEN_INCLUDE_PATH}/Eigen/src/Core/util/Macros.h" EIGEN_VERSION_LINES EIGEN_WORLD_VERSION EIGEN_MAJOR_VERSION EIGEN_MINOR_VERSION)
|
||||
set(HAVE_EIGEN 1)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
################## Extra HighGUI libs on Windows ###################
|
||||
if(WIN32)
|
||||
set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} comctl32 gdi32 ole32)
|
||||
|
||||
if(WITH_VIDEOINPUT)
|
||||
set(HAVE_VIDEOINPUT 1)
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} vfw32)
|
||||
endif()
|
||||
|
||||
if(MINGW)
|
||||
if(MINGW64)
|
||||
set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} msvfw32 avifil32 avicap32 winmm)
|
||||
else()
|
||||
set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} vfw32 winmm)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_OPENGL AND NOT HAVE_QT_OPENGL)
|
||||
find_package(OpenGL QUIET)
|
||||
|
||||
if(OPENGL_FOUND)
|
||||
set(HAVE_OPENGL 1)
|
||||
set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${OPENGL_LIBRARIES})
|
||||
ocv_include_directories(${OPENGL_INCLUDE_DIR})
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Solution folders:
|
||||
@@ -630,6 +427,13 @@ if(BUILD_EXAMPLES OR BUILD_ANDROID_EXAMPLES OR INSTALL_PYTHON_EXAMPLES)
|
||||
add_subdirectory(samples)
|
||||
endif()
|
||||
|
||||
if(BUILD_ANDROID_SERVICE)
|
||||
add_subdirectory(android/service)
|
||||
endif()
|
||||
|
||||
if(BUILD_ANDROID_PACKAGE)
|
||||
add_subdirectory(android/package)
|
||||
endif()
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Finalization: generate configuration-based files
|
||||
@@ -658,12 +462,12 @@ if(OPENCV_SVNVERSION)
|
||||
status("Version control:" ${OPENCV_SVNVERSION})
|
||||
endif()
|
||||
|
||||
#build platform
|
||||
# ========================== build platform ==========================
|
||||
status("")
|
||||
status(" Platform:")
|
||||
status(" Host:" ${CMAKE_HOST_SYSTEM_NAME} ${CMAKE_HOST_SYSTEM_VERSION} ${CMAKE_HOST_SYSTEM_PROCESSOR})
|
||||
if(CMAKE_CROSSCOMPILING)
|
||||
status(" Target:" ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_VERSION} ${CMAKE_SYSTEM_PROCESSOR})
|
||||
status(" Target:" ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_VERSION} ${CMAKE_SYSTEM_PROCESSOR})
|
||||
endif()
|
||||
status(" CMake:" ${CMAKE_VERSION})
|
||||
status(" CMake generator:" ${CMAKE_GENERATOR})
|
||||
@@ -678,7 +482,7 @@ if(NOT CMAKE_GENERATOR MATCHES "Xcode|Visual Studio")
|
||||
status(" Configuration:" ${CMAKE_BUILD_TYPE})
|
||||
endif()
|
||||
|
||||
# C/C++ options
|
||||
# ========================== C/C++ options ==========================
|
||||
status("")
|
||||
status(" C/C++:")
|
||||
status(" Built as dynamic libs?:" BUILD_SHARED_LIBS THEN YES ELSE NO)
|
||||
@@ -695,8 +499,9 @@ else()
|
||||
status(" Linker flags (Release):" ${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_RELEASE})
|
||||
status(" Linker flags (Debug):" ${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_DEBUG})
|
||||
endif()
|
||||
status(" Precompiled headers:" PCHSupport_FOUND AND ENABLE_PRECOMPILED_HEADERS THEN YES ELSE NO)
|
||||
|
||||
# OpenCV modules
|
||||
# ========================== OpenCV modules ==========================
|
||||
status("")
|
||||
status(" OpenCV modules:")
|
||||
string(REPLACE "opencv_" "" OPENCV_MODULES_BUILD_ST "${OPENCV_MODULES_BUILD}")
|
||||
@@ -715,11 +520,11 @@ endforeach()
|
||||
string(REPLACE "opencv_" "" OPENCV_MODULES_DISABLED_AUTO_ST "${OPENCV_MODULES_DISABLED_AUTO_ST}")
|
||||
|
||||
status(" To be built:" OPENCV_MODULES_BUILD THEN ${OPENCV_MODULES_BUILD_ST} ELSE "-")
|
||||
status(" Disabled by user:" OPENCV_MODULES_DISABLED_USER THEN ${OPENCV_MODULES_DISABLED_USER_ST} ELSE "-")
|
||||
status(" Disabled:" OPENCV_MODULES_DISABLED_USER THEN ${OPENCV_MODULES_DISABLED_USER_ST} ELSE "-")
|
||||
status(" Disabled by dependency:" OPENCV_MODULES_DISABLED_AUTO THEN ${OPENCV_MODULES_DISABLED_AUTO_ST} ELSE "-")
|
||||
status(" Unavailable:" OPENCV_MODULES_DISABLED_FORCE THEN ${OPENCV_MODULES_DISABLED_FORCE_ST} ELSE "-")
|
||||
|
||||
# Android extra
|
||||
# ========================== Android details ==========================
|
||||
if(ANDROID)
|
||||
status("")
|
||||
status(" Android: ")
|
||||
@@ -733,16 +538,20 @@ if(ANDROID)
|
||||
endif()
|
||||
status(" android tool:" ANDROID_EXECUTABLE THEN "${ANDROID_EXECUTABLE} (${ANDROID_TOOLS_Pkg_Desc})" ELSE NO)
|
||||
status(" ant:" ANT_EXECUTABLE THEN "${ANT_EXECUTABLE} (ver ${ANT_VERSION})" ELSE NO)
|
||||
status(" Google Play package:" BUILD_ANDROID_PACKAGE THEN YES ELSE NO)
|
||||
endif()
|
||||
|
||||
#YV
|
||||
# ========================== GUI ==========================
|
||||
status("")
|
||||
status(" GUI: ")
|
||||
|
||||
if (HAVE_QT)
|
||||
if(HAVE_QT)
|
||||
status(" QT 4.x:" HAVE_QT THEN "YES (ver ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH} ${QT_EDITION})" ELSE NO)
|
||||
status(" QT OpenGL support:" HAVE_QT_OPENGL THEN "YES (${QT_QTOPENGL_LIBRARY})" ELSE NO)
|
||||
else()
|
||||
if(DEFINED WITH_QT)
|
||||
status(" QT 4.x:" NO)
|
||||
endif()
|
||||
if(WIN32)
|
||||
status(" Win32 UI:" YES)
|
||||
else()
|
||||
@@ -762,7 +571,7 @@ endif()
|
||||
|
||||
status(" OpenGL support:" HAVE_OPENGL THEN "YES (${OPENGL_LIBRARIES})" ELSE NO)
|
||||
|
||||
# media
|
||||
# ========================== MEDIA IO ==========================
|
||||
status("")
|
||||
status(" Media I/O: ")
|
||||
status(" ZLib:" BUILD_ZLIB THEN "build (ver ${ZLIB_VERSION_STRING})" ELSE "${ZLIB_LIBRARY} (ver ${ZLIB_VERSION_STRING})")
|
||||
@@ -781,7 +590,7 @@ if(WITH_TIFF)
|
||||
if(TIFF_VERSION_STRING AND TIFF_FOUND)
|
||||
status(" TIFF:" "${TIFF_LIBRARY} (ver ${TIFF_VERSION} - ${TIFF_VERSION_STRING})")
|
||||
else()
|
||||
status(" TIFF:" TIFF_FOUND THEN "${TIFF_LIBRARY} (ver ${TIFF_VERSION})" ELSE "build (ver ${TIFF_VERSION})")
|
||||
status(" TIFF:" TIFF_FOUND THEN "${TIFF_LIBRARY} (ver ${TIFF_VERSION})" ELSE "build (ver ${TIFF_VERSION} - ${TIFF_VERSION_STRING})")
|
||||
endif()
|
||||
else()
|
||||
status(" TIFF:" "NO")
|
||||
@@ -793,82 +602,120 @@ else()
|
||||
endif()
|
||||
|
||||
status(" OpenEXR:" WITH_OPENEXR AND OPENEXR_FOUND THEN "${OPENEXR_LIBRARIES} (ver ${OPENEXR_VERSION})" ELSE NO)
|
||||
status(" OpenNI:" HAVE_OPENNI THEN "YES (ver ${OPENNI_VERSION_STRING}, build ${OPENNI_VERSION_BUILD})" ELSE NO)
|
||||
status(" OpenNI PrimeSensor Modules:"
|
||||
HAVE_OPENNI_PRIME_SENSOR_MODULE THEN "YES (${OPENNI_PRIME_SENSOR_MODULE})" ELSE NO)
|
||||
if(WIN32)
|
||||
status(" XIMEA:" HAVE_XIMEA THEN YES ELSE NO)
|
||||
endif()
|
||||
|
||||
# video
|
||||
# ========================== VIDEO IO ==========================
|
||||
status("")
|
||||
if(UNIX AND NOT APPLE)
|
||||
status(" Video I/O:")
|
||||
status(" Video I/O:")
|
||||
|
||||
if(DEFINED WITH_1394)
|
||||
status(" DC1394 1.x:" HAVE_DC1394 THEN "YES (ver ${ALIASOF_libdc1394_VERSION})" ELSE NO)
|
||||
status(" DC1394 2.x:" HAVE_DC1394_2 THEN "YES (ver ${ALIASOF_libdc1394-2_VERSION})" ELSE NO)
|
||||
status(" GStreamer:" HAVE_GSTREAMER THEN "" ELSE NO)
|
||||
endif(DEFINED WITH_1394)
|
||||
|
||||
if(ANDROID)
|
||||
if(HAVE_opencv_androidcamera)
|
||||
status(" AndroidNativeCamera:" BUILD_ANDROID_CAMERA_WRAPPER
|
||||
THEN "YES, build for Android${ANDROID_VERSION}" ELSE "YES, use prebuilt libraries")
|
||||
else()
|
||||
status(" AndroidNativeCamera:" "NO (native camera requires Android API level 8 or higher)")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(DEFINED WITH_AVFOUNDATION)
|
||||
status(" AVFoundation:" WITH_AVFOUNDATION THEN YES ELSE NO)
|
||||
endif(DEFINED WITH_AVFOUNDATION)
|
||||
|
||||
if(DEFINED WITH_FFMPEG)
|
||||
if(WIN32)
|
||||
status(" FFMPEG:" WITH_FFMPEG THEN "YES (prebuilt binaries)" ELSE NO)
|
||||
else()
|
||||
status(" FFMPEG:" HAVE_FFMPEG THEN YES ELSE NO)
|
||||
endif()
|
||||
status(" codec:" HAVE_FFMPEG_CODEC THEN "YES (ver ${ALIASOF_libavcodec_VERSION})" ELSE NO)
|
||||
status(" format:" HAVE_FFMPEG_FORMAT THEN "YES (ver ${ALIASOF_libavformat_VERSION})" ELSE NO)
|
||||
status(" util:" HAVE_FFMPEG_UTIL THEN "YES (ver ${ALIASOF_libavutil_VERSION})" ELSE NO)
|
||||
status(" swscale:" HAVE_FFMPEG_SWSCALE THEN "YES (ver ${ALIASOF_libswscale_VERSION})" ELSE NO)
|
||||
status(" gentoo-style:" HAVE_GENTOO_FFMPEG THEN YES ELSE NO)
|
||||
endif(DEFINED WITH_FFMPEG)
|
||||
|
||||
if(DEFINED WITH_GSTREAMER)
|
||||
status(" GStreamer:" HAVE_GSTREAMER THEN "" ELSE NO)
|
||||
if(HAVE_GSTREAMER)
|
||||
status(" base:" "YES (ver ${ALIASOF_gstreamer-base-0.10_VERSION})")
|
||||
status(" app:" "YES (ver ${ALIASOF_gstreamer-app-0.10_VERSION})")
|
||||
status(" video:" "YES (ver ${ALIASOF_gstreamer-video-0.10_VERSION})")
|
||||
endif()
|
||||
status(" UniCap:" HAVE_UNICAP THEN "YES (ver ${ALIASOF_libunicap_VERSION})" ELSE NO)
|
||||
status(" UniCap ucil:" HAVE_UNICAP_UCIL THEN "YES (ver ${ALIASOF_libucil_VERSION})" ELSE NO)
|
||||
status(" PvAPI:" HAVE_PVAPI THEN YES ELSE NO)
|
||||
endif(DEFINED WITH_GSTREAMER)
|
||||
|
||||
if(DEFINED WITH_OPENNI)
|
||||
status(" OpenNI:" HAVE_OPENNI THEN "YES (ver ${OPENNI_VERSION_STRING}, build ${OPENNI_VERSION_BUILD})"
|
||||
ELSE NO)
|
||||
status(" OpenNI PrimeSensor Modules:" HAVE_OPENNI_PRIME_SENSOR_MODULE
|
||||
THEN "YES (${OPENNI_PRIME_SENSOR_MODULE})" ELSE NO)
|
||||
endif(DEFINED WITH_OPENNI)
|
||||
|
||||
if(DEFINED WITH_PVAPI)
|
||||
status(" PvAPI:" HAVE_PVAPI THEN YES ELSE NO)
|
||||
endif(DEFINED WITH_PVAPI)
|
||||
|
||||
if(DEFINED WITH_QUICKTIME)
|
||||
status(" QuickTime:" WITH_QUICKTIME THEN YES ELSE NO)
|
||||
status(" QTKit:" WITH_QUICKTIME THEN NO ELSE YES)
|
||||
endif(DEFINED WITH_QUICKTIME)
|
||||
|
||||
if(DEFINED WITH_UNICAP)
|
||||
status(" UniCap:" HAVE_UNICAP THEN "YES (ver ${ALIASOF_libunicap_VERSION})" ELSE NO)
|
||||
status(" UniCap ucil:" HAVE_UNICAP_UCIL THEN "YES (ver ${ALIASOF_libucil_VERSION})" ELSE NO)
|
||||
endif(DEFINED WITH_UNICAP)
|
||||
|
||||
if(DEFINED WITH_V4L)
|
||||
if(HAVE_CAMV4L)
|
||||
set(HAVE_CAMV4L_STR "YES")
|
||||
else()
|
||||
set(HAVE_CAMV4L_STR "NO")
|
||||
endif()
|
||||
if(HAVE_CAMV4L2)
|
||||
if(HAVE_CAMV4L2)
|
||||
set(HAVE_CAMV4L2_STR "YES")
|
||||
else()
|
||||
set(HAVE_CAMV4L2_STR "NO")
|
||||
endif()
|
||||
status(" V4L/V4L2:" HAVE_LIBV4L THEN "Using libv4l (ver ${ALIASOF_libv4l1_VERSION})" ELSE "${HAVE_CAMV4L_STR}/${HAVE_CAMV4L2_STR}")
|
||||
status(" Xine:" HAVE_XINE THEN "YES (ver ${ALIASOF_libxine_VERSION})" ELSE NO)
|
||||
status(" V4L/V4L2:" HAVE_LIBV4L THEN "Using libv4l (ver ${ALIASOF_libv4l1_VERSION})"
|
||||
ELSE "${HAVE_CAMV4L_STR}/${HAVE_CAMV4L2_STR}")
|
||||
endif(DEFINED WITH_V4L)
|
||||
|
||||
if(ANDROID)
|
||||
if(HAVE_opencv_androidcamera)
|
||||
status(" AndroidNativeCamera:" BUILD_ANDROID_CAMERA_WRAPPER THEN "YES, build for Android ${ANDROID_VERSION}" ELSE "YES, use prebuilt libraries")
|
||||
else()
|
||||
status(" AndroidNativeCamera:" "NO (native camera requires Android API level 8 or higher)")
|
||||
endif()
|
||||
endif()
|
||||
elseif(APPLE)
|
||||
if(NOT IOS)
|
||||
status(" Video I/O:" WITH_QUICKTIME THEN QuickTime ELSE QTKit)
|
||||
else()
|
||||
status(" Video I/O: AVFoundation")
|
||||
endif()
|
||||
elseif(WIN32)
|
||||
status(" Video I/O:" HAVE_VIDEOINPUT THEN DirectShow ELSE NO)
|
||||
endif()
|
||||
if(DEFINED WITH_VIDEOINPUT)
|
||||
status(" DirectShow:" HAVE_VIDEOINPUT THEN YES ELSE NO)
|
||||
endif(DEFINED WITH_VIDEOINPUT)
|
||||
|
||||
if(WIN32)
|
||||
status(" FFMPEG:" WITH_FFMPEG THEN "YES (prebuilt binaries)" ELSE NO)
|
||||
else()
|
||||
status(" FFMPEG:" HAVE_FFMPEG THEN YES ELSE NO)
|
||||
endif()
|
||||
status(" codec:" HAVE_FFMPEG_CODEC THEN "YES (ver ${ALIASOF_libavcodec_VERSION})" ELSE NO)
|
||||
status(" format:" HAVE_FFMPEG_FORMAT THEN "YES (ver ${ALIASOF_libavformat_VERSION})" ELSE NO)
|
||||
status(" util:" HAVE_FFMPEG_UTIL THEN "YES (ver ${ALIASOF_libavutil_VERSION})" ELSE NO)
|
||||
status(" swscale:" HAVE_FFMPEG_SWSCALE THEN "YES (ver ${ALIASOF_libswscale_VERSION})" ELSE NO)
|
||||
status(" gentoo-style:" HAVE_GENTOO_FFMPEG THEN YES ELSE NO)
|
||||
if(DEFINED WITH_XIMEA)
|
||||
status(" XIMEA:" HAVE_XIMEA THEN YES ELSE NO)
|
||||
endif(DEFINED WITH_XIMEA)
|
||||
|
||||
# Other third-party libraries
|
||||
if(DEFINED WITH_XINE)
|
||||
status(" Xine:" HAVE_XINE THEN "YES (ver ${ALIASOF_libxine_VERSION})" ELSE NO)
|
||||
endif(DEFINED WITH_XINE)
|
||||
|
||||
# ========================== Other third-party libraries ==========================
|
||||
status("")
|
||||
status(" Other third-party libraries:")
|
||||
|
||||
if(WITH_IPP AND IPP_FOUND)
|
||||
status(" Use IPP:" "${IPP_LATEST_VERSION_STR} [${IPP_LATEST_VERSION_MAJOR}.${IPP_LATEST_VERSION_MINOR}.${IPP_LATEST_VERSION_BUILD}]")
|
||||
status(" at:" "${IPP_ROOT_DIR}")
|
||||
else()
|
||||
status(" Use IPP:" WITH_IPP AND NOT IPP_FOUND THEN "IPP not found" ELSE NO)
|
||||
endif()
|
||||
if(DEFINED WITH_IPP)
|
||||
if(WITH_IPP AND IPP_FOUND)
|
||||
status(" Use IPP:" "${IPP_LATEST_VERSION_STR} [${IPP_LATEST_VERSION_MAJOR}.${IPP_LATEST_VERSION_MINOR}.${IPP_LATEST_VERSION_BUILD}]")
|
||||
status(" at:" "${IPP_ROOT_DIR}")
|
||||
else()
|
||||
status(" Use IPP:" WITH_IPP AND NOT IPP_FOUND THEN "IPP not found" ELSE NO)
|
||||
endif()
|
||||
endif(DEFINED WITH_IPP)
|
||||
|
||||
if(DEFINED WITH_TBB)
|
||||
status(" Use TBB:" HAVE_TBB THEN "YES (ver ${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR} interface ${TBB_INTERFACE_VERSION})" ELSE NO)
|
||||
endif(DEFINED WITH_TBB)
|
||||
|
||||
if(DEFINED WITH_CUDA)
|
||||
status(" Use Cuda:" HAVE_CUDA THEN "YES (ver ${CUDA_VERSION_STRING})" ELSE NO)
|
||||
endif(DEFINED WITH_CUDA)
|
||||
|
||||
status(" Use TBB:" HAVE_TBB THEN "YES (ver ${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR} interface ${TBB_INTERFACE_VERSION})" ELSE NO)
|
||||
status(" Use Cuda:" HAVE_CUDA THEN "YES (ver ${CUDA_VERSION_STRING})" ELSE NO)
|
||||
status(" Use Eigen:" HAVE_EIGEN THEN "YES (ver ${EIGEN_WORLD_VERSION}.${EIGEN_MAJOR_VERSION}.${EIGEN_MINOR_VERSION})" ELSE NO)
|
||||
|
||||
if(HAVE_CUDA)
|
||||
@@ -882,7 +729,7 @@ if(HAVE_CUDA)
|
||||
status(" NVIDIA GPU features:" ${OPENCV_CUDA_ARCH_FEATURES})
|
||||
endif()
|
||||
|
||||
# interfaces to other languages
|
||||
# ========================== python ==========================
|
||||
status("")
|
||||
status(" Python:")
|
||||
status(" Interpreter:" PYTHON_EXECUTABLE THEN "${PYTHON_EXECUTABLE} (ver ${PYTHON_VERSION_FULL})" ELSE NO)
|
||||
@@ -896,12 +743,7 @@ if(BUILD_opencv_python)
|
||||
status(" packages path:" PYTHON_EXECUTABLE THEN "${PYTHON_PACKAGES_PATH}" ELSE "-")
|
||||
endif()
|
||||
|
||||
if(BUILD_opencv_java)
|
||||
status("")
|
||||
status(" Java:" HAVE_opencv_java THEN YES ELSE NO)
|
||||
endif()
|
||||
|
||||
# documentation
|
||||
# ========================== documentation ==========================
|
||||
if(BUILD_DOCS)
|
||||
status("")
|
||||
status(" Documentation:")
|
||||
@@ -914,7 +756,7 @@ if(BUILD_DOCS)
|
||||
status(" PdfLaTeX compiler:" PDFLATEX_COMPILER THEN "${PDFLATEX_COMPILER}" ELSE NO)
|
||||
endif()
|
||||
|
||||
# samples and tests
|
||||
# ========================== samples and tests ==========================
|
||||
status("")
|
||||
status(" Tests and samples:")
|
||||
status(" Tests:" BUILD_TESTS AND HAVE_opencv_ts THEN YES ELSE NO)
|
||||
@@ -922,11 +764,11 @@ status(" Performance tests:" BUILD_PERF_TESTS AND HAVE_opencv_ts THEN YES EL
|
||||
status(" Examples:" BUILD_EXAMPLES THEN YES ELSE NO)
|
||||
|
||||
if(ANDROID)
|
||||
status(" Android tests:" BUILD_TESTS AND CAN_BUILD_ANDROID_PROJECTS THEN YES ELSE NO)
|
||||
status(" Android examples:" BUILD_ANDROID_EXAMPLES THEN YES ELSE NO)
|
||||
status(" Android tests:" BUILD_TESTS AND CAN_BUILD_ANDROID_PROJECTS THEN YES ELSE NO)
|
||||
status(" Android examples:" BUILD_ANDROID_EXAMPLES AND CAN_BUILD_ANDROID_PROJECTS THEN YES ELSE NO)
|
||||
endif()
|
||||
|
||||
#auxiliary
|
||||
# ========================== auxiliary ==========================
|
||||
status("")
|
||||
status(" Install path:" "${CMAKE_INSTALL_PREFIX}")
|
||||
status("")
|
||||
|
||||
@@ -1 +1 @@
|
||||
See http://opencv.willowgarage.com/wiki/Android
|
||||
See http://code.opencv.org/projects/opencv/wiki/OpenCV4Android
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# ------------------------------------------------------------------------------
|
||||
# Android CMake toolchain file, for use with the Android NDK r5-r7
|
||||
# Android CMake toolchain file, for use with the Android NDK r5-r8
|
||||
# Requires cmake 2.6.3 or newer (2.8.3 or newer is recommended).
|
||||
# See home page: http://code.google.com/p/android-cmake/
|
||||
#
|
||||
@@ -20,7 +20,7 @@
|
||||
#
|
||||
# Usage Windows:
|
||||
# You need native port of make to build your project.
|
||||
# Android NDK r7 already has make.exe on board.
|
||||
# Android NDK r7 (or newer) already has make.exe on board.
|
||||
# For older NDK you have to install it separately.
|
||||
# For example, this one: http://gnuwin32.sourceforge.net/packages/make.htm
|
||||
#
|
||||
@@ -36,13 +36,13 @@
|
||||
# ANDROID_NDK=/opt/android-ndk - path to the NDK root.
|
||||
# Can be set as environment variable. Can be set only at first cmake run.
|
||||
#
|
||||
# ANDROID_STANDALONE_TOOLCHAIN=/opt/android-toolchain - path to the
|
||||
# ANDROID_STANDALONE_TOOLCHAIN=/opt/android-toolchain - path to the
|
||||
# standalone toolchain. This option is not used if full NDK is found
|
||||
# (ignored if ANDROID_NDK is set).
|
||||
# Can be set as environment variable. Can be set only at first cmake run.
|
||||
#
|
||||
# ANDROID_ABI=armeabi-v7a - specifies the target Application Binary
|
||||
# Interface (ABI). This option nearly matches to the APP_ABI variable
|
||||
# Interface (ABI). This option nearly matches to the APP_ABI variable
|
||||
# used by ndk-build tool from Android NDK.
|
||||
# Possible values are:
|
||||
# "armeabi" - matches to the NDK ABI with the same name.
|
||||
@@ -94,10 +94,10 @@
|
||||
# The flags will be prepopulated with critical flags, so don't loose them.
|
||||
# Also be aware that toolchain also sets configuration-specific compiler
|
||||
# flags and linker flags.
|
||||
#
|
||||
# ANDROID and BUILD_ANDROID will be set to true, you may test any of these
|
||||
#
|
||||
# ANDROID and BUILD_ANDROID will be set to true, you may test any of these
|
||||
# variables to make necessary Android-specific configuration changes.
|
||||
#
|
||||
#
|
||||
# Also ARMEABI or ARMEABI_V7A or X86 will be set true, mutually exclusive.
|
||||
# NEON option will be set true if VFP is set to NEON.
|
||||
#
|
||||
@@ -131,7 +131,7 @@
|
||||
# cmake pass
|
||||
# [~] toolchain exits with error if ARM_TARGET is not recognized
|
||||
# - modified June 2011
|
||||
# [~] default NDK path is updated for version r5c
|
||||
# [~] default NDK path is updated for version r5c
|
||||
# [+] variable CMAKE_SYSTEM_PROCESSOR is set based on ARM_TARGET
|
||||
# [~] toolchain install directory is added to linker paths
|
||||
# [-] removed SWIG-related stuff from toolchain
|
||||
@@ -177,6 +177,9 @@
|
||||
# [+] updated for NDK r7c
|
||||
# [~] fixed most of problems with compiler/linker flags and caching
|
||||
# [+] added option ANDROID_FUNCTION_LEVEL_LINKING
|
||||
# - modified May 2012
|
||||
# [+] updated for NDK r8
|
||||
# [+] added mips architecture support
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
cmake_minimum_required( VERSION 2.6.3 )
|
||||
@@ -186,7 +189,8 @@ if( DEFINED CMAKE_CROSSCOMPILING )
|
||||
return()
|
||||
endif()
|
||||
|
||||
if( PROJECT_NAME STREQUAL "CMAKE_TRY_COMPILE" )
|
||||
get_property(_CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE)
|
||||
if( _CMAKE_IN_TRY_COMPILE )
|
||||
include( "${CMAKE_CURRENT_SOURCE_DIR}/../android.toolchain.config.cmake" OPTIONAL )
|
||||
endif()
|
||||
|
||||
@@ -195,7 +199,7 @@ set( CMAKE_SYSTEM_NAME Linux )
|
||||
#this one not so much
|
||||
set( CMAKE_SYSTEM_VERSION 1 )
|
||||
|
||||
set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS} -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" )
|
||||
set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS} -r8 -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" )
|
||||
if(NOT DEFINED ANDROID_NDK_SEARCH_PATHS)
|
||||
if( CMAKE_HOST_WIN32 )
|
||||
file( TO_CMAKE_PATH "$ENV{PROGRAMFILES}" ANDROID_NDK_SEARCH_PATHS )
|
||||
@@ -211,9 +215,11 @@ endif()
|
||||
|
||||
set( ANDROID_SUPPORTED_ABIS_arm "armeabi-v7a;armeabi;armeabi-v7a with NEON;armeabi-v7a with VFPV3;armeabi-v6 with VFP" )
|
||||
set( ANDROID_SUPPORTED_ABIS_x86 "x86" )
|
||||
set( ANDROID_SUPPORTED_ABIS_mipsel "mips" )
|
||||
|
||||
set( ANDROID_DEFAULT_NDK_API_LEVEL 8 )
|
||||
set( ANDROID_DEFAULT_NDK_API_LEVEL_x86 9 )
|
||||
set( ANDROID_DEFAULT_NDK_API_LEVEL_mips 9 )
|
||||
|
||||
|
||||
macro( __LIST_FILTER listvar regex )
|
||||
@@ -432,6 +438,7 @@ endif()
|
||||
#get all the details about standalone toolchain
|
||||
if( BUILD_WITH_STANDALONE_TOOLCHAIN )
|
||||
__DETECT_NATIVE_API_LEVEL( ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_STANDALONE_TOOLCHAIN}/sysroot/usr/include/android/api-level.h" )
|
||||
set( ANDROID_STANDALONE_TOOLCHAIN_API_LEVEL ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} )
|
||||
set( __availableToolchains "standalone" )
|
||||
__DETECT_TOOLCHAIN_MACHINE_NAME( __availableToolchainMachines "${ANDROID_STANDALONE_TOOLCHAIN}" )
|
||||
if( NOT __availableToolchainMachines )
|
||||
@@ -441,6 +448,8 @@ if( BUILD_WITH_STANDALONE_TOOLCHAIN )
|
||||
set( __availableToolchainArchs "x86" )
|
||||
elseif( __availableToolchainMachines MATCHES arm )
|
||||
set( __availableToolchainArchs "arm" )
|
||||
elseif( __availableToolchainMachines MATCHES mipsel )
|
||||
set( __availableToolchainArchs "mipsel" )
|
||||
endif()
|
||||
if( ANDROID_COMPILER_VERSION )
|
||||
#do not run gcc every time because it is relatevely expencive
|
||||
@@ -513,16 +522,25 @@ if( ANDROID_ABI STREQUAL "x86" )
|
||||
set( X86 true )
|
||||
set( ANDROID_NDK_ABI_NAME "x86" )
|
||||
set( ANDROID_ARCH_NAME "x86" )
|
||||
set( ANDROID_ARCH_FULLNAME "x86" )
|
||||
set( CMAKE_SYSTEM_PROCESSOR "i686" )
|
||||
elseif( ANDROID_ABI STREQUAL "mips" )
|
||||
set( MIPS true )
|
||||
set( ANDROID_NDK_ABI_NAME "mips" )
|
||||
set( ANDROID_ARCH_NAME "mips" )
|
||||
set( ANDROID_ARCH_FULLNAME "mipsel" )
|
||||
set( CMAKE_SYSTEM_PROCESSOR "mips" )
|
||||
elseif( ANDROID_ABI STREQUAL "armeabi" )
|
||||
set( ARMEABI true )
|
||||
set( ANDROID_NDK_ABI_NAME "armeabi" )
|
||||
set( ANDROID_ARCH_NAME "arm" )
|
||||
set( ANDROID_ARCH_FULLNAME "arm" )
|
||||
set( CMAKE_SYSTEM_PROCESSOR "armv5te" )
|
||||
elseif( ANDROID_ABI STREQUAL "armeabi-v6 with VFP" )
|
||||
set( ARMEABI_V6 true )
|
||||
set( ANDROID_NDK_ABI_NAME "armeabi" )
|
||||
set( ANDROID_ARCH_NAME "arm" )
|
||||
set( ANDROID_ARCH_FULLNAME "arm" )
|
||||
set( CMAKE_SYSTEM_PROCESSOR "armv6" )
|
||||
#need always fallback to older platform
|
||||
set( ARMEABI true )
|
||||
@@ -530,17 +548,20 @@ elseif( ANDROID_ABI STREQUAL "armeabi-v7a")
|
||||
set( ARMEABI_V7A true )
|
||||
set( ANDROID_NDK_ABI_NAME "armeabi-v7a" )
|
||||
set( ANDROID_ARCH_NAME "arm" )
|
||||
set( ANDROID_ARCH_FULLNAME "arm" )
|
||||
set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
|
||||
elseif( ANDROID_ABI STREQUAL "armeabi-v7a with VFPV3" )
|
||||
set( ARMEABI_V7A true )
|
||||
set( ANDROID_NDK_ABI_NAME "armeabi-v7a" )
|
||||
set( ANDROID_ARCH_NAME "arm" )
|
||||
set( ANDROID_ARCH_FULLNAME "arm" )
|
||||
set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
|
||||
set( VFPV3 true )
|
||||
elseif( ANDROID_ABI STREQUAL "armeabi-v7a with NEON" )
|
||||
set( ARMEABI_V7A true )
|
||||
set( ANDROID_NDK_ABI_NAME "armeabi-v7a" )
|
||||
set( ANDROID_ARCH_NAME "arm" )
|
||||
set( ANDROID_ARCH_FULLNAME "arm" )
|
||||
set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
|
||||
set( VFPV3 true )
|
||||
set( NEON true )
|
||||
@@ -554,10 +575,10 @@ if( CMAKE_BINARY_DIR AND EXISTS "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMa
|
||||
file( APPEND "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeSystem.cmake" "SET(CMAKE_SYSTEM_PROCESSOR \"${CMAKE_SYSTEM_PROCESSOR}\")\n" )
|
||||
endif()
|
||||
|
||||
set( ANDROID_SUPPORTED_ABIS ${ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_NAME}} CACHE INTERNAL "ANDROID_ABI can be changed only to one of these ABIs. Changing to any other ABI requires to reset cmake cache." )
|
||||
set( ANDROID_SUPPORTED_ABIS ${ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_FULLNAME}} CACHE INTERNAL "ANDROID_ABI can be changed only to one of these ABIs. Changing to any other ABI requires to reset cmake cache." )
|
||||
if( CMAKE_VERSION VERSION_GREATER "2.8" )
|
||||
list( SORT ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_NAME} )
|
||||
set_property( CACHE ANDROID_ABI PROPERTY STRINGS ${ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_NAME}} )
|
||||
list( SORT ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_FULLNAME} )
|
||||
set_property( CACHE ANDROID_ABI PROPERTY STRINGS ${ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_FULLNAME}} )
|
||||
endif()
|
||||
|
||||
if( ANDROID_ARCH_NAME STREQUAL "arm" AND NOT ARMEABI_V6 )
|
||||
@@ -575,7 +596,7 @@ if( ANDROID_TOOLCHAIN_NAME )
|
||||
message( FATAL_ERROR "Previously selected toolchain \"${ANDROID_TOOLCHAIN_NAME}\" is missing. You need to remove CMakeCache.txt and rerun cmake manually to change the toolchain" )
|
||||
endif()
|
||||
list( GET __availableToolchainArchs ${__toolchainIdx} __toolchainArch )
|
||||
if( NOT __toolchainArch STREQUAL ANDROID_ARCH_NAME )
|
||||
if( NOT __toolchainArch STREQUAL ANDROID_ARCH_FULLNAME )
|
||||
message( SEND_ERROR "Previously selected toolchain \"${ANDROID_TOOLCHAIN_NAME}\" is not able to compile binaries for the \"${ANDROID_ARCH_NAME}\" platform." )
|
||||
endif()
|
||||
else()
|
||||
@@ -586,7 +607,7 @@ else()
|
||||
math( EXPR __availableToolchainsCount "${__availableToolchainsCount}-1" )
|
||||
foreach( __idx RANGE ${__availableToolchainsCount} )
|
||||
list( GET __availableToolchainArchs ${__idx} __toolchainArch )
|
||||
if( __toolchainArch STREQUAL ANDROID_ARCH_NAME )
|
||||
if( __toolchainArch STREQUAL ANDROID_ARCH_FULLNAME )
|
||||
list( GET __availableToolchainCompilerVersions ${__idx} __toolchainVersion )
|
||||
if( __toolchainVersion VERSION_GREATER __toolchainMaxVersion )
|
||||
set( __toolchainMaxVersion "${__toolchainVersion}" )
|
||||
@@ -614,7 +635,7 @@ unset( __availableToolchainArchs )
|
||||
unset( __availableToolchainCompilerVersions )
|
||||
|
||||
#choose native API level
|
||||
__INIT_VARIABLE( ANDROID_NATIVE_API_LEVEL ENV_ANDROID_NATIVE_API_LEVEL ANDROID_API_LEVEL ENV_ANDROID_API_LEVEL ANDROID_DEFAULT_NDK_API_LEVEL_${ANDROID_ARCH_NAME} ANDROID_DEFAULT_NDK_API_LEVEL )
|
||||
__INIT_VARIABLE( ANDROID_NATIVE_API_LEVEL ENV_ANDROID_NATIVE_API_LEVEL ANDROID_API_LEVEL ENV_ANDROID_API_LEVEL ANDROID_STANDALONE_TOOLCHAIN_API_LEVEL ANDROID_DEFAULT_NDK_API_LEVEL_${ANDROID_ARCH_NAME} ANDROID_DEFAULT_NDK_API_LEVEL )
|
||||
string( REGEX MATCH "[0-9]+" ANDROID_NATIVE_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}" )
|
||||
#validate
|
||||
list( FIND ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_NATIVE_API_LEVEL}" __levelIdx )
|
||||
@@ -684,12 +705,14 @@ set( ANDROID_SYSTEM_LIB_DIRS "" )
|
||||
set( LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_SOURCE_DIR} CACHE PATH "root for library output, set this to change where android libs are installed to" )
|
||||
set( CMAKE_INSTALL_PREFIX "${ANDROID_TOOLCHAIN_ROOT}/user" CACHE STRING "path for installing" )
|
||||
|
||||
if( EXISTS "${CMAKE_SOURCE_DIR}/jni/CMakeLists.txt" )
|
||||
set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin/${ANDROID_NDK_ABI_NAME}" CACHE PATH "Output directory for applications" )
|
||||
else()
|
||||
set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin" CACHE PATH "Output directory for applications" )
|
||||
if(NOT _CMAKE_IN_TRY_COMPILE)
|
||||
if( EXISTS "${CMAKE_SOURCE_DIR}/jni/CMakeLists.txt" )
|
||||
set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin/${ANDROID_NDK_ABI_NAME}" CACHE PATH "Output directory for applications" )
|
||||
else()
|
||||
set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin" CACHE PATH "Output directory for applications" )
|
||||
endif()
|
||||
set( LIBRARY_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/libs/${ANDROID_NDK_ABI_NAME}" CACHE PATH "path for android libs" )
|
||||
endif()
|
||||
set( LIBRARY_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/libs/${ANDROID_NDK_ABI_NAME}" CACHE PATH "path for android libs" )
|
||||
|
||||
#includes
|
||||
list( APPEND ANDROID_SYSTEM_INCLUDE_DIRS "${ANDROID_SYSROOT}/usr/include" )
|
||||
@@ -745,32 +768,30 @@ set( CMAKE_COMPILER_IS_GNUASM 1)
|
||||
# NDK flags
|
||||
if( ARMEABI OR ARMEABI_V7A )
|
||||
# NDK also defines -ffunction-sections -funwind-tables but they result in worse OpenCV performance
|
||||
set( CMAKE_CXX_FLAGS "-fPIC -Wno-psabi" )
|
||||
set( CMAKE_C_FLAGS "-fPIC -Wno-psabi" )
|
||||
if( ANDROID_USE_STLPORT )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions" )
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-rtti -fno-exceptions" )
|
||||
else()
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frtti -fexceptions" )
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexceptions" )
|
||||
endif()
|
||||
set( _CMAKE_CXX_FLAGS "-fPIC -Wno-psabi" )
|
||||
set( _CMAKE_C_FLAGS "-fPIC -Wno-psabi" )
|
||||
remove_definitions( -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ )
|
||||
add_definitions( -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ )
|
||||
# extra arm-specific flags
|
||||
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fsigned-char" )
|
||||
elseif( X86 )
|
||||
set( CMAKE_CXX_FLAGS "-funwind-tables" )
|
||||
set( CMAKE_C_FLAGS "-funwind-tables" )
|
||||
if( ANDROID_USE_STLPORT )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions" )
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-rtti -fno-exceptions" )
|
||||
else()
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frtti -fexceptions" )
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexceptions" )
|
||||
endif()
|
||||
set( _CMAKE_CXX_FLAGS "-funwind-tables" )
|
||||
set( _CMAKE_C_FLAGS "-funwind-tables" )
|
||||
elseif( MIPS )
|
||||
set( _CMAKE_CXX_FLAGS "-fpic -Wno-psabi -fno-strict-aliasing -finline-functions -ffunction-sections -funwind-tables -fmessage-length=0 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers" )
|
||||
set( _CMAKE_CXX_FLAGS "-fpic -Wno-psabi -fno-strict-aliasing -finline-functions -ffunction-sections -funwind-tables -fmessage-length=0 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers" )
|
||||
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fsigned-char" )
|
||||
else()
|
||||
set( CMAKE_CXX_FLAGS "" )
|
||||
set( CMAKE_C_FLAGS "" )
|
||||
set( _CMAKE_CXX_FLAGS "" )
|
||||
set( _CMAKE_C_FLAGS "" )
|
||||
endif()
|
||||
|
||||
if( ANDROID_USE_STLPORT )
|
||||
set( _CMAKE_CXX_FLAGS "${_CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions" )
|
||||
set( _CMAKE_C_FLAGS "${_CMAKE_C_FLAGS} -fno-rtti -fno-exceptions" )
|
||||
else()
|
||||
set( _CMAKE_CXX_FLAGS "${_CMAKE_CXX_FLAGS} -frtti -fexceptions" )
|
||||
set( _CMAKE_C_FLAGS "${_CMAKE_C_FLAGS} -fexceptions" )
|
||||
endif()
|
||||
|
||||
#release and debug flags
|
||||
@@ -779,28 +800,33 @@ if( ARMEABI OR ARMEABI_V7A )
|
||||
#It is recommended to use the -mthumb compiler flag to force the generation
|
||||
#of 16-bit Thumb-1 instructions (the default being 32-bit ARM ones).
|
||||
# O3 instead of O2/Os in release mode - like cmake sets for desktop gcc
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "-mthumb -O3" )
|
||||
set( CMAKE_C_FLAGS_RELEASE "-mthumb -O3" )
|
||||
set( CMAKE_CXX_FLAGS_DEBUG "-marm -Os -finline-limit=64" )
|
||||
set( CMAKE_C_FLAGS_DEBUG "-marm -Os -finline-limit=64" )
|
||||
set( _CMAKE_CXX_FLAGS_RELEASE "-mthumb -O3" )
|
||||
set( _CMAKE_C_FLAGS_RELEASE "-mthumb -O3" )
|
||||
set( _CMAKE_CXX_FLAGS_DEBUG "-marm -Os -finline-limit=64" )
|
||||
set( _CMAKE_C_FLAGS_DEBUG "-marm -Os -finline-limit=64" )
|
||||
else()
|
||||
# always compile ARMEABI_V6 in arm mode; otherwise there is no difference from ARMEABI
|
||||
# O3 instead of O2/Os in release mode - like cmake sets for desktop gcc
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "-marm -O3 -fstrict-aliasing" )
|
||||
set( CMAKE_C_FLAGS_RELEASE "-marm -O3 -fstrict-aliasing" )
|
||||
set( CMAKE_CXX_FLAGS_DEBUG "-marm -O0 -finline-limit=300" )
|
||||
set( CMAKE_C_FLAGS_DEBUG "-marm -O0 -finline-limit=300" )
|
||||
set( _CMAKE_CXX_FLAGS_RELEASE "-marm -O3 -fstrict-aliasing" )
|
||||
set( _CMAKE_C_FLAGS_RELEASE "-marm -O3 -fstrict-aliasing" )
|
||||
set( _CMAKE_CXX_FLAGS_DEBUG "-marm -O0 -finline-limit=300" )
|
||||
set( _CMAKE_C_FLAGS_DEBUG "-marm -O0 -finline-limit=300" )
|
||||
endif()
|
||||
elseif( X86 )
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "-O3 -fstrict-aliasing" )
|
||||
set( CMAKE_C_FLAGS_RELEASE "-O3 -fstrict-aliasing" )
|
||||
set( CMAKE_CXX_FLAGS_DEBUG "-O0 -finline-limit=300" )
|
||||
set( CMAKE_C_FLAGS_DEBUG "-O0 -finline-limit=300" )
|
||||
set( _CMAKE_CXX_FLAGS_RELEASE "-O3 -fstrict-aliasing" )
|
||||
set( _CMAKE_C_FLAGS_RELEASE "-O3 -fstrict-aliasing" )
|
||||
set( _CMAKE_CXX_FLAGS_DEBUG "-O0 -finline-limit=300" )
|
||||
set( _CMAKE_C_FLAGS_DEBUG "-O0 -finline-limit=300" )
|
||||
elseif( MIPS )
|
||||
set( _CMAKE_CXX_FLAGS_RELEASE "-O3 -funswitch-loops -finline-limit=300" )
|
||||
set( _CMAKE_C_FLAGS_RELEASE "-O3 -funswitch-loops -finline-limit=300" )
|
||||
set( _CMAKE_CXX_FLAGS_DEBUG "-O0 -g" )
|
||||
set( _CMAKE_C_FLAGS_DEBUG "-O0 -g" )
|
||||
endif()
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fomit-frame-pointer -DNDEBUG" )
|
||||
set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -fomit-frame-pointer -DNDEBUG" )
|
||||
set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-strict-aliasing -fno-omit-frame-pointer -DDEBUG -D_DEBUG" )
|
||||
set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -fno-strict-aliasing -fno-omit-frame-pointer -DDEBUG -D_DEBUG" )
|
||||
set( _CMAKE_CXX_FLAGS_RELEASE "${_CMAKE_CXX_FLAGS_RELEASE} -fomit-frame-pointer -DNDEBUG" )
|
||||
set( _CMAKE_C_FLAGS_RELEASE "${_CMAKE_C_FLAGS_RELEASE} -fomit-frame-pointer -DNDEBUG" )
|
||||
set( _CMAKE_CXX_FLAGS_DEBUG "${_CMAKE_CXX_FLAGS_DEBUG} -fno-strict-aliasing -fno-omit-frame-pointer -DDEBUG -D_DEBUG" )
|
||||
set( _CMAKE_C_FLAGS_DEBUG "${_CMAKE_C_FLAGS_DEBUG} -fno-strict-aliasing -fno-omit-frame-pointer -DDEBUG -D_DEBUG" )
|
||||
|
||||
#ABI-specific flags
|
||||
if( ARMEABI_V7A )
|
||||
@@ -904,12 +930,12 @@ if( ARMEABI_V7A )
|
||||
endif()
|
||||
|
||||
#cache flags
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags" )
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags" )
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}" CACHE STRING "c++ Release flags" )
|
||||
set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE STRING "c Release flags" )
|
||||
set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING "c++ Debug flags" )
|
||||
set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" CACHE STRING "c Debug flags" )
|
||||
set( CMAKE_CXX_FLAGS "${_CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags" )
|
||||
set( CMAKE_C_FLAGS "${_CMAKE_C_FLAGS}" CACHE STRING "c flags" )
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "${_CMAKE_CXX_FLAGS_RELEASE}" CACHE STRING "c++ Release flags" )
|
||||
set( CMAKE_C_FLAGS_RELEASE "${_CMAKE_C_FLAGS_RELEASE}" CACHE STRING "c Release flags" )
|
||||
set( CMAKE_CXX_FLAGS_DEBUG "${_CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING "c++ Debug flags" )
|
||||
set( CMAKE_C_FLAGS_DEBUG "${_CMAKE_C_FLAGS_DEBUG}" CACHE STRING "c Debug flags" )
|
||||
set( CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "linker flags" )
|
||||
set( CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "linker flags" )
|
||||
set( CMAKE_EXE_LINKER_FLAGS "-Wl,-z,nocopyreloc" CACHE STRING "linker flags" )
|
||||
@@ -922,15 +948,21 @@ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS}" CACHE INTERNAL "Extra Androi
|
||||
set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS}" CACHE INTERNAL "Extra Android linker flags")
|
||||
set( CMAKE_CXX_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_CXX_FLAGS}" )
|
||||
set( CMAKE_C_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_C_FLAGS}" )
|
||||
set( CMAKE_SHARED_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}" )
|
||||
set( CMAKE_MODULE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}" )
|
||||
set( CMAKE_EXE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}" )
|
||||
if( MIPS AND BUILD_WITH_ANDROID_NDK )
|
||||
set( CMAKE_SHARED_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/mipself.xsc ${ANDROID_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}" )
|
||||
set( CMAKE_MODULE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/mipself.xsc ${ANDROID_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}" )
|
||||
set( CMAKE_EXE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/mipself.x ${ANDROID_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}" )
|
||||
else()
|
||||
set( CMAKE_SHARED_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}" )
|
||||
set( CMAKE_MODULE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}" )
|
||||
set( CMAKE_EXE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}" )
|
||||
endif()
|
||||
|
||||
#set these global flags for cmake client scripts to change behavior
|
||||
set( ANDROID True )
|
||||
set( BUILD_ANDROID True )
|
||||
|
||||
# where is the target environment
|
||||
# where is the target environment
|
||||
set( CMAKE_FIND_ROOT_PATH "${ANDROID_TOOLCHAIN_ROOT}/bin" "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" "${ANDROID_SYSROOT}" "${CMAKE_INSTALL_PREFIX}" "${CMAKE_INSTALL_PREFIX}/share" )
|
||||
|
||||
# only search for libraries and includes in the ndk toolchain
|
||||
@@ -1020,10 +1052,10 @@ endif()
|
||||
|
||||
|
||||
# Variables controlling behavior or set by cmake toolchain:
|
||||
# ANDROID_ABI : "armeabi-v7a" (default), "armeabi", "armeabi-v7a with NEON", "armeabi-v7a with VFPV3", "armeabi-v6 with VFP", "x86"
|
||||
# ANDROID_ABI : "armeabi-v7a" (default), "armeabi", "armeabi-v7a with NEON", "armeabi-v7a with VFPV3", "armeabi-v6 with VFP", "x86", "mips"
|
||||
# ANDROID_NATIVE_API_LEVEL : 3,4,5,8,9,14 (depends on NDK version)
|
||||
# ANDROID_SET_OBSOLETE_VARIABLES : ON/OFF
|
||||
# ANDROID_USE_STLPORT : OFF/ON - EXPERIMENTAL!!!
|
||||
# ANDROID_USE_STLPORT : OFF/ON - EXPERIMENTAL!!!
|
||||
# ANDROID_FORBID_SYGWIN : ON/OFF
|
||||
# ANDROID_NO_UNDEFINED : ON/OFF
|
||||
# ANDROID_SO_UNDEFINED : OFF/ON (default depends on NDK version)
|
||||
@@ -1054,7 +1086,7 @@ endif()
|
||||
# BUILD_WITH_STANDALONE_TOOLCHAIN : TRUE if standalone toolchain is used
|
||||
# ANDROID_NDK_HOST_SYSTEM_NAME : "windows", "linux-x86" or "darwin-x86" depending on host platform
|
||||
# ANDROID_NDK_ABI_NAME : "armeabi", "armeabi-v7a" or "x86" depending on ANDROID_ABI
|
||||
# ANDROID_ARCH_NAME : "arm" or "x86" depending on ANDROID_ABI
|
||||
# ANDROID_ARCH_NAME : "arm" or "x86" or "mips" depending on ANDROID_ABI
|
||||
# TOOL_OS_SUFFIX : "" or ".exe" depending on host platform
|
||||
# ANDROID_SYSROOT : path to the compiler sysroot
|
||||
# ANDROID_SYSTEM_INCLUDE_DIRS
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.opencv.lib_v@OPENCV_VERSION_MAJOR@@OPENCV_VERSION_MINOR@_@ANDROID_PACKAGE_PLATFORM@"
|
||||
android:versionCode="@OPENCV_VERSION_PATCH@@ANDROID_PACKAGE_RELEASE@"
|
||||
android:versionName="@OPENCV_VERSION_PATCH@.@ANDROID_PACKAGE_RELEASE@" >
|
||||
|
||||
<uses-sdk android:minSdkVersion="@ANDROID_SDK_VERSION@" />
|
||||
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
|
||||
|
||||
<application
|
||||
android:icon="@drawable/icon"
|
||||
android:label="@string/app_name" >
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
@@ -0,0 +1,94 @@
|
||||
if(NOT ANDROID_PACKAGE_RELEASE)
|
||||
set(ANDROID_PACKAGE_RELEASE 1)
|
||||
endif()
|
||||
|
||||
if(NOT ANDROID_PACKAGE_PLATFORM)
|
||||
if(ARMEABI_V7A)
|
||||
if(NEON)
|
||||
set(ANDROID_PACKAGE_PLATFORM armv7a_neon)
|
||||
else()
|
||||
set(ANDROID_PACKAGE_PLATFORM armv7a)
|
||||
endif()
|
||||
elseif(ARMEABI_V6)
|
||||
set(ANDROID_PACKAGE_PLATFORM armv6)
|
||||
elseif(ARMEABI)
|
||||
set(ANDROID_PACKAGE_PLATFORM armv5)
|
||||
elseif(X86)
|
||||
set(ANDROID_PACKAGE_PLATFORM x86)
|
||||
elseif(MIPS)
|
||||
set(ANDROID_PACKAGE_PLATFORM mips)
|
||||
else()
|
||||
message(ERROR "Can not automatically determine the value for ANDROID_PACKAGE_PLATFORM")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT ANDROID_PACKAGE_PLATFORM_NAME)
|
||||
if(ARMEABI_V7A)
|
||||
if(NEON)
|
||||
set(ANDROID_PACKAGE_PLATFORM_NAME "armeabi-v7a with NEON")
|
||||
else()
|
||||
set(ANDROID_PACKAGE_PLATFORM_NAME "armeabi-v7a")
|
||||
endif()
|
||||
elseif(ARMEABI_V6)
|
||||
set(ANDROID_PACKAGE_PLATFORM_NAME "armeabi-v6")
|
||||
elseif(ARMEABI)
|
||||
set(ANDROID_PACKAGE_PLATFORM_NAME "armeabi")
|
||||
elseif(X86)
|
||||
set(ANDROID_PACKAGE_PLATFORM_NAME "x86")
|
||||
elseif(MIPS)
|
||||
set(ANDROID_PACKAGE_PLATFORM_NAME "mips")
|
||||
else()
|
||||
message(ERROR "Can not automatically determine the value for ANDROID_PACKAGE_PLATFORM_NAME")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if("${ANDROID_NATIVE_API_LEVEL}" MATCHES "[1-9][0-9]*$")
|
||||
set(ANDROID_SDK_VERSION ${CMAKE_MATCH_0})
|
||||
endif()
|
||||
|
||||
if(NOT ANDROID_SDK_VERSION GREATER 7)
|
||||
set(ANDROID_SDK_VERSION 8)
|
||||
endif()
|
||||
|
||||
set(PACKAGE_DIR "${OpenCV_BINARY_DIR}/package")
|
||||
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/${ANDROID_MANIFEST_FILE}" "${PACKAGE_DIR}/${ANDROID_MANIFEST_FILE}" @ONLY)
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/res/values/strings.xml" "${PACKAGE_DIR}/res/values/strings.xml" @ONLY)
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/res/drawable/icon.png" "${PACKAGE_DIR}/res/drawable/icon.png" COPYONLY)
|
||||
|
||||
set(target_name "OpenCV_${OPENCV_VERSION_MAJOR}.${OPENCV_VERSION_MINOR}.${OPENCV_VERSION_PATCH}_binary_pack_${ANDROID_PACKAGE_PLATFORM}")
|
||||
get_target_property(opencv_java_location opencv_java LOCATION)
|
||||
|
||||
set(android_proj_target_files ${ANDROID_PROJECT_FILES})
|
||||
ocv_list_add_prefix(android_proj_target_files "${PACKAGE_DIR}/")
|
||||
android_get_compatible_target(android_proj_sdk_target ${ANDROID_SDK_VERSION})
|
||||
set(APK_NAME "${PACKAGE_DIR}/bin/${target_name}-release-unsigned.apk")
|
||||
|
||||
file(GLOB camera_wrappers "${OpenCV_SOURCE_DIR}/3rdparty/lib/${ANDROID_NDK_ABI_NAME}/libnative_camera_r*.so")
|
||||
set(CAMERA_LIB_COMMANDS "")
|
||||
|
||||
foreach(wrapper ${camera_wrappers})
|
||||
list(APPEND CAMERA_LIB_COMMANDS COMMAND ${CMAKE_COMMAND} -E copy "${wrapper}" "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/")
|
||||
endforeach()
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT "${APK_NAME}"
|
||||
COMMAND ${CMAKE_COMMAND} -E remove_directory "${PACKAGE_DIR}/libs"
|
||||
COMMAND ${CMAKE_COMMAND} -E remove_directory "${PACKAGE_DIR}/bin"
|
||||
COMMAND ${CMAKE_COMMAND} -E remove_directory "${PACKAGE_DIR}/gen"
|
||||
COMMAND ${CMAKE_COMMAND} -E remove ${android_proj_target_files}
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory "${PACKAGE_DIR}/src"
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/"
|
||||
${CAMERA_LIB_COMMANDS}
|
||||
COMMAND ${CMAKE_COMMAND} -E copy "${opencv_java_location}" "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/"
|
||||
COMMAND ${ANDROID_EXECUTABLE} --silent update project --path "${PACKAGE_DIR}" --target "${android_proj_sdk_target}" --name "${target_name}"
|
||||
COMMAND ${ANT_EXECUTABLE} -q -noinput -k release
|
||||
COMMAND ${CMAKE_COMMAND} -E touch "${APK_NAME}"
|
||||
WORKING_DIRECTORY "${PACKAGE_DIR}"
|
||||
MAIN_DEPENDENCY "${PACKAGE_DIR}/${ANDROID_MANIFEST_FILE}"
|
||||
DEPENDS "${OpenCV_BINARY_DIR}/bin/.classes.jar.dephelper" "${PACKAGE_DIR}/res/values/strings.xml" "${PACKAGE_DIR}/res/drawable/icon.png" ${camera_wrappers} opencv_java
|
||||
)
|
||||
|
||||
install(FILES "${APK_NAME}" DESTINATION "apk/" COMPONENT main)
|
||||
add_custom_target(android_package ALL SOURCES "${APK_NAME}" )
|
||||
add_dependencies(android_package opencv_java)
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<string name="app_name">OCV @OPENCV_VERSION_MAJOR@.@OPENCV_VERSION_MINOR@ pack @ANDROID_PACKAGE_PLATFORM_NAME@</string>
|
||||
|
||||
</resources>
|
||||
@@ -0,0 +1,8 @@
|
||||
############################
|
||||
OpenCV4Android Reference
|
||||
############################
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
service/doc/index.rst
|
||||
@@ -1,5 +1,5 @@
|
||||
@ECHO OFF
|
||||
|
||||
PUSHD %~dp0..
|
||||
CALL .\scripts\build.cmd %*
|
||||
CALL .\scripts\build.cmd %* -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON
|
||||
POPD
|
||||
@@ -4,5 +4,5 @@ cd `dirname $0`/..
|
||||
mkdir -p build
|
||||
cd build
|
||||
|
||||
cmake -DCMAKE_TOOLCHAIN_FILE=../android.toolchain.cmake $@ ../..
|
||||
cmake -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DCMAKE_TOOLCHAIN_FILE=../android.toolchain.cmake $@ ../..
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
cd `dirname $0`/..
|
||||
|
||||
mkdir -p build_service
|
||||
cd build_service
|
||||
|
||||
cmake -DCMAKE_TOOLCHAIN_FILE=../android.toolchain.cmake -DANDROID_USE_STLPORT=ON -DBUILD_ANDROID_SERVICE=ON -DANDROID_SOURCE_TREE=~/Projects/AndroidSource/2.2.2/ $@ ../..
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
|
||||
cd `dirname $0`/..
|
||||
|
||||
mkdir -p build_x86
|
||||
cd build_x86
|
||||
|
||||
cmake -DANDROID_ABI=x86 -DCMAKE_TOOLCHAIN_FILE=../android.toolchain.cmake $@ ../..
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
add_subdirectory(engine)
|
||||
#add_subdirectory(engine_test)
|
||||
@@ -0,0 +1,22 @@
|
||||
***************
|
||||
Package Content
|
||||
***************
|
||||
|
||||
The package provides new OpenCV SDK that uses OpenCV Manager for library initialization. OpenCV Manager provides the following benefits:
|
||||
|
||||
* Less memory usage. All apps use the same binaries from service and do not keep native libs inside them self;
|
||||
* Hardware specific optimizations for all supported platforms;
|
||||
* Trusted OpenCV library source. All packages with OpenCV are published on Google Play service;
|
||||
* Regular updates and bug fixes;
|
||||
|
||||
Package consists from Library Project for Java development with Eclipse, C++ headers and libraries for native application development, javadoc samples and prebuilt binaries for ARM and X86 platforms.
|
||||
To try new SDK on serial device with Google Play just install sample package and follow application messages (Google Play service access will be needed).
|
||||
TO start example on device without Google Play you need to install OpenCV manager package and OpenCV binary pack for your platform from apk folder before.
|
||||
See docs/doc/tutorials/introduction/android_binary_package/android_binary_package.html and docs/android/refmain.html for details about service.
|
||||
On-line documentation will be available at address: http://docs.opencv.org/trunk
|
||||
|
||||
********
|
||||
Contacts
|
||||
********
|
||||
|
||||
Please send all feedback to Alexander Smorkalov mailto: alexander.smorkalov@itseez.com
|
||||
@@ -0,0 +1,14 @@
|
||||
*********************************************
|
||||
Base Loader Callback Interface implementation
|
||||
*********************************************
|
||||
|
||||
.. highlight:: java
|
||||
.. module:: org.opencv.android
|
||||
:platform: Android
|
||||
:synopsis: Implements OpenCV initialization callback interface.
|
||||
.. class:: BaseLoaderCallback
|
||||
|
||||
Basic implementation of LoaderCallbackInterface. Implementation logic is described by diagram.
|
||||
|
||||
.. image:: img/AndroidAppUsageModel.dia.png
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
**************************
|
||||
Install Callback Interface
|
||||
**************************
|
||||
.. highlight:: java
|
||||
.. module:: org.opencv.android
|
||||
:platform: Android
|
||||
:synopsis: Defines callback interface for package management.
|
||||
|
||||
.. class:: InstallCallbackInterface
|
||||
|
||||
Callback interface for package installation or update.
|
||||
|
||||
String getPackageName()
|
||||
-----------------------
|
||||
|
||||
.. method:: String getPackageName()
|
||||
|
||||
Get name of a package to be installed
|
||||
|
||||
:rtype: String
|
||||
:return: Return package name, i.e. "OpenCV Manager Service" or "OpenCV library"
|
||||
|
||||
void install()
|
||||
--------------
|
||||
|
||||
.. method:: void install()
|
||||
|
||||
Installation of package is approved
|
||||
|
||||
void cancel()
|
||||
-------------
|
||||
|
||||
.. method:: void cancel()
|
||||
|
||||
Installation if package was canceled
|
||||
@@ -0,0 +1,40 @@
|
||||
|
||||
.. _Android_OpenCV_Manager_Intro:
|
||||
|
||||
************
|
||||
Introduction
|
||||
************
|
||||
|
||||
.. highlight:: java
|
||||
|
||||
OpenCV Manager is an Android service targeted to manage OpenCV library binaries on end users devices. It allows sharing the OpenCV dynamic libraries of different versions between applications on the same device. The Manager provides the following benefits\:
|
||||
|
||||
#. Less memory usage. All apps use the same binaries from service and do not keep native libs inside them self;
|
||||
#. Hardware specific optimizations for all supported platforms;
|
||||
#. Trusted OpenCV library source. All packages with OpenCV are published on Google Play service;
|
||||
#. Regular updates and bug fixes;
|
||||
|
||||
Usage model for target user
|
||||
---------------------------
|
||||
|
||||
.. image:: img/AndroidAppUsageModel.dia.png
|
||||
|
||||
First OpenCV app\:
|
||||
|
||||
#. User downloads app dependent from OpenCV from Google Play or installs it manually;
|
||||
#. User starts application. Application asks user to install OpenCV Manager;
|
||||
#. User installs OpenCV Manager from Google Play Service;
|
||||
#. User starts application. Application proposes to user to install OpenCV library for target device and runs Google Play;
|
||||
#. User runs app in the third time and gets what he or she wants.
|
||||
|
||||
Next OpenCV app\:
|
||||
|
||||
#. User downloads app dependent from OpenCV from Google Play or installs it manually;
|
||||
#. User starts application.
|
||||
#. If selected version is not installed Manager asks user to install OpenCV library package and runs Google Play;
|
||||
#. User runs app in the second time and gets what he or she wants.
|
||||
|
||||
OpenCV Manager structure
|
||||
------------------------
|
||||
|
||||
.. image:: img/Structure.dia.png
|
||||
@@ -0,0 +1,50 @@
|
||||
******************
|
||||
Java OpenCV Loader
|
||||
******************
|
||||
|
||||
.. highlight:: java
|
||||
.. module:: org.opencv.android
|
||||
:platform: Android
|
||||
:synopsis: Implements Android dependent Java classes.
|
||||
.. Class:: OpenCVLoader
|
||||
|
||||
Helper class provides common initialization methods for OpenCV library
|
||||
|
||||
boolean initDebug()
|
||||
-------------------
|
||||
|
||||
.. method:: static boolean initDebug()
|
||||
|
||||
Load and initialize OpenCV library from current application package. Roughly it is analog of system.loadLibrary("opencv_java")
|
||||
|
||||
:rtype: boolean
|
||||
:return: Return true if initialization of OpenCV was successful
|
||||
|
||||
.. note:: This way is deprecated for production code. It is designed for experimantal and local development purposes only. If you want to publish your app use approach with async initialization
|
||||
|
||||
boolean initAsync()
|
||||
-------------------
|
||||
|
||||
.. method:: static boolean initAsync(String Version, Context AppContext, LoaderCallbackInterface Callback)
|
||||
|
||||
Load and initialize OpenCV library using OpenCV Manager service.
|
||||
|
||||
:param Version: OpenCV Library version
|
||||
:param AppContext: Application context for connecting to service
|
||||
:param Callback: Object, that implements LoaderCallbackInterface for handling Connection status. See BaseLoaderCallback.
|
||||
:rtype: boolean
|
||||
:return: Return true if initialization of OpenCV starts successfully
|
||||
|
||||
OpenCV version constants
|
||||
-------------------------
|
||||
|
||||
.. data:: OPENCV_VERSION_2_4_2
|
||||
|
||||
OpenCV Library version 2.4.2
|
||||
|
||||
Other constatnts
|
||||
----------------
|
||||
|
||||
.. data:: OPEN_CV_SERVICE_URL
|
||||
|
||||
Url for OpenCV Manager on Google Play (Android Market)
|
||||
@@ -0,0 +1,56 @@
|
||||
*************************
|
||||
Loader Callback Interface
|
||||
*************************
|
||||
|
||||
.. highlight:: java
|
||||
.. module:: org.opencv.android
|
||||
:platform: Android
|
||||
:synopsis: Defines OpenCV initialization callback interface.
|
||||
.. class:: LoaderCallbackInterface
|
||||
|
||||
Interface for callback object in case of asynchronous initialization of OpenCV
|
||||
|
||||
void onManagerConnected()
|
||||
-------------------------
|
||||
|
||||
.. method:: void onManagerConnected(int status)
|
||||
|
||||
Callback method that is called after OpenCV library initialization
|
||||
|
||||
:param status: Status of initialization. See Initialization status constants
|
||||
|
||||
void onPackageInstall()
|
||||
-----------------------
|
||||
|
||||
.. method:: void onPackageInstall(InstallCallbackInterface Callback)
|
||||
|
||||
Callback method that is called in case when package installation is needed
|
||||
|
||||
@param callback Answer object with approve and cancel methods and package description
|
||||
|
||||
Initialization status constants
|
||||
-------------------------------
|
||||
|
||||
.. data:: SUCCESS
|
||||
|
||||
OpenCV initialization finished successfully
|
||||
|
||||
.. data:: RESTART_REQUIRED
|
||||
|
||||
OpenCV library installation via Google Play service was initialized. Application restart is required
|
||||
|
||||
.. data:: MARKET_ERROR
|
||||
|
||||
Google Play (Android Market) cannot be invoked
|
||||
|
||||
.. data:: INSTALL_CANCELED
|
||||
|
||||
OpenCV library installation was canceled by user
|
||||
|
||||
.. data:: INCOMPATIBLE_MANAGER_VERSION
|
||||
|
||||
Version of OpenCV Manager Service is incompatible with this app. Service update is needed
|
||||
|
||||
.. data:: INIT_FAILED
|
||||
|
||||
OpenCV library initialization failed
|
||||
@@ -0,0 +1,89 @@
|
||||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = _build
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
|
||||
.PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
@echo " dirhtml to make HTML files named index.html in directories"
|
||||
@echo " pickle to make pickle files"
|
||||
@echo " json to make JSON files"
|
||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||
@echo " qthelp to make HTML files and a qthelp project"
|
||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||
|
||||
clean:
|
||||
-rm -rf $(BUILDDIR)/*
|
||||
|
||||
html:
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
|
||||
dirhtml:
|
||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||
|
||||
pickle:
|
||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||
@echo
|
||||
@echo "Build finished; now you can process the pickle files."
|
||||
|
||||
json:
|
||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||
@echo
|
||||
@echo "Build finished; now you can process the JSON files."
|
||||
|
||||
htmlhelp:
|
||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||
|
||||
qthelp:
|
||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/OpenCVEngine.qhcp"
|
||||
@echo "To view the help file:"
|
||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/OpenCVEngine.qhc"
|
||||
|
||||
latex:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo
|
||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||
@echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
|
||||
"run these through (pdf)latex."
|
||||
|
||||
changes:
|
||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||
@echo
|
||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||
|
||||
linkcheck:
|
||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||
@echo
|
||||
@echo "Link check complete; look for any errors in the above output " \
|
||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||
|
||||
doctest:
|
||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||
@echo "Testing of doctests in the sources finished, look at the " \
|
||||
"results in $(BUILDDIR)/doctest/output.txt."
|
||||
@@ -0,0 +1,29 @@
|
||||
*******************************************
|
||||
Engine use Cases
|
||||
*******************************************
|
||||
|
||||
First application start
|
||||
-----------------------
|
||||
|
||||
There is no OpenCV Manager and OpenCV libraries.
|
||||
|
||||
.. image:: img/NoService.dia.png
|
||||
|
||||
Second application start
|
||||
------------------------
|
||||
|
||||
There is OpenCV Manager service, but there is no OpenCV library.
|
||||
If OpenCV library installation approved\:
|
||||
|
||||
.. image:: img/LibInstallAproved.dia.png
|
||||
|
||||
If OpenCV library installation canceled\:
|
||||
|
||||
.. image:: img/LibInstallCanceled.dia.png
|
||||
|
||||
Regular application start
|
||||
-------------------------
|
||||
|
||||
OpenCV Manager and OpenCV library has bee already installed.
|
||||
|
||||
.. image:: img/LibInstalled.dia.png
|
||||
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import os
|
||||
|
||||
TARGET_PATH = "img"
|
||||
|
||||
pipe = os.popen("which dia")
|
||||
DiaPath = pipe.readline()
|
||||
DiaPath = DiaPath.strip("\n");
|
||||
pipe.close()
|
||||
|
||||
if ("" == DiaPath):
|
||||
print("Error: Dia tool was not found")
|
||||
exit(-1)
|
||||
|
||||
print("Dia tool: \"%s\"" % DiaPath)
|
||||
|
||||
if (not os.path.exists(TARGET_PATH)):
|
||||
os.mkdir("img")
|
||||
|
||||
for filename in os.listdir("."):
|
||||
if ("dia" == filename[-3:]):
|
||||
os.system("%s --export %s %s" % (DiaPath, os.path.join(TARGET_PATH, filename + ".png"), filename))
|
||||
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 35 KiB |
@@ -0,0 +1,18 @@
|
||||
|
||||
.. _Android_OpenCV_Manager:
|
||||
|
||||
***********************
|
||||
Android OpenCV Manager
|
||||
***********************
|
||||
|
||||
Contents:
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
Intro
|
||||
UseCases
|
||||
JavaHelper
|
||||
BaseLoaderCallback
|
||||
LoaderCallbackInterface
|
||||
InstallCallbackInterface
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="gen"/>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
||||
<classpathentry kind="output" path="bin/classes"/>
|
||||
</classpath>
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>OpenCV-2.4.0</name>
|
||||
<name>OpenCVEngineService</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.opencv.engine"
|
||||
android:versionCode="11"
|
||||
android:versionName="1.1" >
|
||||
|
||||
<uses-sdk android:minSdkVersion="8" />
|
||||
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
|
||||
|
||||
<application
|
||||
android:icon="@drawable/icon"
|
||||
android:label="@string/app_name" >
|
||||
|
||||
<service android:exported="true" android:name="OpenCVEngineService" android:process=":OpenCVEngineProcess">
|
||||
<intent-filter>
|
||||
<action android:name="org.opencv.engine.BIND"></action>
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<activity android:name="org.opencv.engine.manager.ManagerActivity" android:label="@string/app_name" >
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
</application>
|
||||
</manifest>
|
||||
@@ -0,0 +1,36 @@
|
||||
set(engine OpenCVEngine)
|
||||
set(JNI_LIB_NAME ${engine} ${engine}_jni)
|
||||
add_android_project(opencv_engine "${CMAKE_CURRENT_SOURCE_DIR}" SDK_TARGET 8 ${ANDROID_SDK_TARGET} IGNORE_JAVA ON)
|
||||
|
||||
link_directories("${ANDROID_SOURCE_TREE}/out/target/product/generic/system/lib" "${ANDROID_SOURCE_TREE}/out/target/product/${ANDROID_PRODUCT}/system/lib" "${ANDROID_SOURCE_TREE}/bin_${ANDROID_ARCH_NAME}/system/lib")
|
||||
|
||||
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-allow-shlib-undefined")
|
||||
file(GLOB engine_files "jni/BinderComponent/*.cpp" "jni/BinderComponent/*.h" "jni/include/*.h")
|
||||
|
||||
include_directories(jni/BinderComponent jni/include)
|
||||
include_directories(SYSTEM "${ANDROID_SOURCE_TREE}/frameworks/base/include" "${ANDROID_SOURCE_TREE}/system/core/include")
|
||||
add_library(${engine} SHARED ${engine_files})
|
||||
target_link_libraries(${engine} z binder log utils)
|
||||
|
||||
set_target_properties(${engine} PROPERTIES
|
||||
OUTPUT_NAME ${engine}
|
||||
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.build/libs/${ANDROID_NDK_ABI_NAME}"
|
||||
)
|
||||
|
||||
get_target_property(engine_lib_location ${engine} LOCATION)
|
||||
add_custom_command(TARGET ${engine} POST_BUILD COMMAND ${CMAKE_STRIP} --strip-unneeded "${engine_lib_location}")
|
||||
|
||||
file(GLOB engine_jni_files "jni/JNIWrapper/*.cpp" "jni/JNIWrapper/*.h" "jni/include/*.h")
|
||||
list(APPEND engine_jni_files jni/NativeService/CommonPackageManager.cpp jni/NativeService/PackageInfo.cpp)
|
||||
|
||||
include_directories(jni/include jni/JNIWrapper jni/NativeService jni/BinderComponent "${ANDROID_SOURCE_TREE}/frameworks/base/include" "${ANDROID_SOURCE_TREE}/system/core/include" "${ANDROID_SOURCE_TREE}/frameworks/base/core/jni")
|
||||
add_library(${engine}_jni SHARED ${engine_jni_files})
|
||||
target_link_libraries(${engine}_jni z binder log utils android_runtime ${engine})
|
||||
|
||||
set_target_properties(${engine}_jni PROPERTIES
|
||||
OUTPUT_NAME ${engine}_jni
|
||||
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.build/libs/${ANDROID_NDK_ABI_NAME}"
|
||||
)
|
||||
|
||||
get_target_property(engine_lib_location ${engine}_jni LOCATION)
|
||||
add_custom_command(TARGET ${engine}_jni POST_BUILD COMMAND ${CMAKE_STRIP} --strip-unneeded "${engine_lib_location}")
|
||||
@@ -0,0 +1,78 @@
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Binder component library
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
|
||||
LOCAL_SRC_FILES := \
|
||||
BinderComponent/OpenCVEngine.cpp \
|
||||
BinderComponent/BnOpenCVEngine.cpp \
|
||||
BinderComponent/BpOpenCVEngine.cpp \
|
||||
BinderComponent/ProcReader.cpp \
|
||||
BinderComponent/TegraDetector.cpp \
|
||||
BinderComponent/StringUtils.cpp \
|
||||
BinderComponent/HardwareDetector.cpp
|
||||
|
||||
LOCAL_C_INCLUDES := \
|
||||
$(LOCAL_PATH)/include \
|
||||
$(LOCAL_PATH)/BinderComponent \
|
||||
$(TOP)/frameworks/base/include \
|
||||
$(TOP)/system/core/include
|
||||
|
||||
LOCAL_CFLAGS += -DPLATFORM_ANDROID
|
||||
|
||||
LOCAL_PRELINK_MODULE := false
|
||||
|
||||
LOCAL_MODULE := libOpenCVEngine
|
||||
|
||||
LOCAL_LDLIBS += -lz -lbinder -llog -lutils
|
||||
|
||||
LOCAL_LDFLAGS += -Wl,-allow-shlib-undefine
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# JNI library for Java service
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
|
||||
LOCAL_SRC_FILES := \
|
||||
JNIWrapper/OpenCVEngine_jni.cpp \
|
||||
NativeService/CommonPackageManager.cpp \
|
||||
JNIWrapper/JavaBasedPackageManager.cpp \
|
||||
NativeService/PackageInfo.cpp \
|
||||
JNIWrapper/HardwareDetector_jni.cpp
|
||||
|
||||
LOCAL_C_INCLUDES := \
|
||||
$(LOCAL_PATH)/include \
|
||||
$(LOCAL_PATH)/JNIWrapper \
|
||||
$(LOCAL_PATH)/NativeService \
|
||||
$(LOCAL_PATH)/BinderComponent \
|
||||
$(TOP)/frameworks/base/include \
|
||||
$(TOP)/system/core/include \
|
||||
$(TOP)/frameworks/base/core/jni
|
||||
|
||||
LOCAL_PRELINK_MODULE := false
|
||||
|
||||
LOCAL_CFLAGS += -DPLATFORM_ANDROID
|
||||
|
||||
LOCAL_MODULE := libOpenCVEngine_jni
|
||||
|
||||
LOCAL_LDLIBS += -lz -lbinder -llog -lutils -landroid_runtime
|
||||
|
||||
LOCAL_SHARED_LIBRARIES = libOpenCVEngine
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Native test application
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
include $(LOCAL_PATH)/Tests/Tests.mk
|
||||
@@ -0,0 +1,5 @@
|
||||
APP_ABI := armeabi x86
|
||||
APP_PLATFORM := android-8
|
||||
APP_STL := stlport_static
|
||||
APP_CPPFLAGS := -fno-rtti -fno-exceptions
|
||||
#APP_OPTIM := debug
|
||||
@@ -0,0 +1,74 @@
|
||||
#include "EngineCommon.h"
|
||||
#include "IOpenCVEngine.h"
|
||||
#include "BnOpenCVEngine.h"
|
||||
#include <utils/Log.h>
|
||||
#include <utils/String8.h>
|
||||
#include <utils/String16.h>
|
||||
|
||||
using namespace android;
|
||||
|
||||
BnOpenCVEngine::~BnOpenCVEngine()
|
||||
{
|
||||
}
|
||||
|
||||
// Notes about data transaction:
|
||||
// Java Binder Wrapper call readInt32 before reading return data
|
||||
// It treet this in value as exception code
|
||||
// OnTransact method support this feature
|
||||
status_t BnOpenCVEngine::onTransact(uint32_t code, const Parcel& data, android::Parcel* reply, uint32_t flags)
|
||||
{
|
||||
LOGD("OpenCVEngine::OnTransact(%u,%u)", code, flags);
|
||||
|
||||
switch(code)
|
||||
{
|
||||
case OCVE_GET_ENGINE_VERSION:
|
||||
{
|
||||
LOGD("OpenCVEngine OCVE_GET_ENGINE_VERSION request");
|
||||
CHECK_INTERFACE(IOpenCVEngine, data, reply);
|
||||
LOGD("OpenCVEngine::GetVersion()");
|
||||
reply->writeInt32(0);
|
||||
return reply->writeInt32(GetVersion());
|
||||
} break;
|
||||
case OCVE_GET_LIB_PATH_BY_VERSION:
|
||||
{
|
||||
LOGD("OpenCVEngine OCVE_GET_LIB_PATH_BY_VERSION request");
|
||||
CHECK_INTERFACE(IOpenCVEngine, data, reply);
|
||||
const String16 version = data.readString16();
|
||||
LOGD("OpenCVEngine::GetLibPathByVersion(%s)", String8(version).string());
|
||||
String16 path = GetLibPathByVersion(version);
|
||||
reply->writeInt32(0);
|
||||
return reply->writeString16(path);
|
||||
} break;
|
||||
case OCVE_GET_LIB_LIST:
|
||||
{
|
||||
LOGD("OpenCVEngine OCVE_GET_LIB_LIST request");
|
||||
CHECK_INTERFACE(IOpenCVEngine, data, reply);
|
||||
const String16 version = data.readString16();
|
||||
LOGD("OpenCVEngine::GetLibraryList(%s)", String8(version).string());
|
||||
String16 path = GetLibraryList(version);
|
||||
reply->writeInt32(0);
|
||||
return reply->writeString16(path);
|
||||
} break;
|
||||
case OCVE_INSTALL_VERSION:
|
||||
{
|
||||
LOGD("OpenCVEngine OCVE_INSTALL_VERSION request");
|
||||
CHECK_INTERFACE(IOpenCVEngine, data, reply);
|
||||
const String16 version = data.readString16();
|
||||
LOGD("OpenCVEngine::InstallVersion(%s)", String8(version).string());
|
||||
bool result = InstallVersion(version);
|
||||
reply->writeInt32(0);
|
||||
int res = reply->writeInt32(static_cast<int32_t>(result));
|
||||
LOGD("InstallVersion call to Binder finished with res %d", res);
|
||||
return res;
|
||||
|
||||
} break;
|
||||
|
||||
default:
|
||||
{
|
||||
LOGD("OpenCVEngine unknown request");
|
||||
return BBinder::onTransact(code, data, reply, flags);
|
||||
}
|
||||
}
|
||||
|
||||
return android::NO_ERROR;
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
#ifndef __BP_OPENCV_ENGINE_H__
|
||||
#define __BP_OPENCV_ENGINE_H__
|
||||
|
||||
#include "EngineCommon.h"
|
||||
#include "IOpenCVEngine.h"
|
||||
#include <binder/IInterface.h>
|
||||
#include <binder/Parcel.h>
|
||||
#include <utils/String16.h>
|
||||
|
||||
class BnOpenCVEngine: public android::BnInterface<IOpenCVEngine>
|
||||
{
|
||||
public:
|
||||
android::status_t onTransact(uint32_t code,
|
||||
const android::Parcel &data,
|
||||
android::Parcel *reply,
|
||||
uint32_t flags);
|
||||
virtual ~BnOpenCVEngine();
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,71 @@
|
||||
#include "IOpenCVEngine.h"
|
||||
#include "BpOpenCVEngine.h"
|
||||
|
||||
using namespace android;
|
||||
|
||||
BpOpenCVEngine::BpOpenCVEngine(const sp<IBinder>& impl):
|
||||
BpInterface<IOpenCVEngine>(impl)
|
||||
{
|
||||
}
|
||||
|
||||
BpOpenCVEngine::~BpOpenCVEngine()
|
||||
{
|
||||
}
|
||||
|
||||
// Notes about data transaction:
|
||||
// Java Binder Wrapper call readInt32 before reading return data
|
||||
// It treet this in value as exception code
|
||||
// This implementation support this feature
|
||||
|
||||
int BpOpenCVEngine::GetVersion()
|
||||
{
|
||||
Parcel data, reply;
|
||||
|
||||
data.writeInterfaceToken(IOpenCVEngine::descriptor);
|
||||
remote()->transact(OCVE_GET_ENGINE_VERSION, data, &reply, 0);
|
||||
// read exception code
|
||||
reply.readInt32();
|
||||
|
||||
return reply.readInt32();
|
||||
}
|
||||
|
||||
String16 BpOpenCVEngine::GetLibPathByVersion(String16 version)
|
||||
{
|
||||
Parcel data, reply;
|
||||
|
||||
data.writeInterfaceToken(IOpenCVEngine::descriptor);
|
||||
data.writeString16(version);
|
||||
remote()->transact(OCVE_GET_LIB_PATH_BY_VERSION, data, &reply, 0);
|
||||
// read exception code
|
||||
reply.readInt32();
|
||||
|
||||
return reply.readString16();
|
||||
}
|
||||
|
||||
android::String16 BpOpenCVEngine::GetLibraryList(String16 version)
|
||||
{
|
||||
Parcel data, reply;
|
||||
|
||||
data.writeInterfaceToken(IOpenCVEngine::descriptor);
|
||||
data.writeString16(version);
|
||||
remote()->transact(OCVE_GET_LIB_LIST, data, &reply, 0);
|
||||
// read exception code
|
||||
reply.readInt32();
|
||||
|
||||
return reply.readString16();
|
||||
}
|
||||
|
||||
bool BpOpenCVEngine::InstallVersion(String16 version)
|
||||
{
|
||||
Parcel data, reply;
|
||||
|
||||
data.writeInterfaceToken(IOpenCVEngine::descriptor);
|
||||
data.writeString16(version);
|
||||
remote()->transact(OCVE_INSTALL_VERSION, data, &reply, 0);
|
||||
// read exception code
|
||||
reply.readInt32();
|
||||
|
||||
return static_cast<bool>(reply.readInt32());
|
||||
}
|
||||
|
||||
IMPLEMENT_META_INTERFACE(OpenCVEngine, OPECV_ENGINE_CLASSNAME)
|
||||
@@ -0,0 +1,20 @@
|
||||
#ifndef __BP_OPENCV_ENGINE_H__
|
||||
#define __BP_OPENCV_ENGINE_H__
|
||||
|
||||
#include "IOpenCVEngine.h"
|
||||
#include <binder/IInterface.h>
|
||||
#include <binder/Parcel.h>
|
||||
#include <utils/String16.h>
|
||||
|
||||
class BpOpenCVEngine: public android::BpInterface<IOpenCVEngine>
|
||||
{
|
||||
public:
|
||||
BpOpenCVEngine(const android::sp<android::IBinder>& impl);
|
||||
virtual ~BpOpenCVEngine();
|
||||
virtual int GetVersion();
|
||||
virtual android::String16 GetLibPathByVersion(android::String16 version);
|
||||
virtual android::String16 GetLibraryList(android::String16 version);
|
||||
virtual bool InstallVersion(android::String16 version);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,179 @@
|
||||
#include "HardwareDetector.h"
|
||||
#include "TegraDetector.h"
|
||||
#include "ProcReader.h"
|
||||
#include "EngineCommon.h"
|
||||
#include "StringUtils.h"
|
||||
#include <utils/Log.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int GetCpuID()
|
||||
{
|
||||
int result = 0;
|
||||
map<string, string> cpu_info = GetCpuInfo();
|
||||
map<string, string>::const_iterator it;
|
||||
|
||||
#ifdef __i386__
|
||||
LOGD("Using X86 HW detector");
|
||||
result |= ARCH_X86;
|
||||
it = cpu_info.find("flags");
|
||||
if (cpu_info.end() != it)
|
||||
{
|
||||
set<string> features = SplitString(it->second, ' ');
|
||||
if (features.end() != features.find(CPU_INFO_SSE_STR))
|
||||
{
|
||||
result |= FEATURES_HAS_SSE;
|
||||
}
|
||||
if (features.end() != features.find(CPU_INFO_SSE2_STR))
|
||||
{
|
||||
result |= FEATURES_HAS_SSE2;
|
||||
}
|
||||
if (features.end() != features.find(CPU_INFO_SSSE3_STR))
|
||||
{
|
||||
result |= FEATURES_HAS_SSSE3;
|
||||
}
|
||||
}
|
||||
#else
|
||||
LOGD("Using ARM HW detector");
|
||||
it = cpu_info.find("Processor");
|
||||
|
||||
if (cpu_info.end() != it)
|
||||
{
|
||||
size_t proc_name_pos = it->second.find(CPU_INFO_ARCH_X86_STR);
|
||||
if (string::npos != proc_name_pos)
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
proc_name_pos = it->second.find(CPU_INFO_ARCH_ARMV7_STR);
|
||||
if (string::npos != proc_name_pos)
|
||||
{
|
||||
result |= ARCH_ARMv7;
|
||||
}
|
||||
else
|
||||
{
|
||||
proc_name_pos = it->second.find(CPU_INFO_ARCH_ARMV6_STR);
|
||||
if (string::npos != proc_name_pos)
|
||||
{
|
||||
result |= ARCH_ARMv6;
|
||||
}
|
||||
else
|
||||
{
|
||||
proc_name_pos = it->second.find(CPU_INFO_ARCH_ARMV5_STR);
|
||||
if (string::npos != proc_name_pos)
|
||||
{
|
||||
result |= ARCH_ARMv5;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return ARCH_UNKNOWN;
|
||||
}
|
||||
|
||||
it = cpu_info.find("Features");
|
||||
if (cpu_info.end() != it)
|
||||
{
|
||||
set<string> features = SplitString(it->second, ' ');
|
||||
if (features.end() != features.find(CPU_INFO_NEON_STR))
|
||||
{
|
||||
result |= FEATURES_HAS_NEON;
|
||||
}
|
||||
if (features.end() != features.find(CPU_INFO_NEON2_STR))
|
||||
{
|
||||
result |= FEATURES_HAS_NEON2;
|
||||
}
|
||||
if (features.end() != features.find(CPU_INFO_VFPV3_STR))
|
||||
{
|
||||
if (features.end () != features.find(CPU_INFO_VFPV3D16_STR))
|
||||
{
|
||||
result |= FEATURES_HAS_VFPv3d16;
|
||||
}
|
||||
else
|
||||
{
|
||||
result |= FEATURES_HAS_VFPv3;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
string GetPlatformName()
|
||||
{
|
||||
map<string, string> cpu_info = GetCpuInfo();
|
||||
string hardware_name = "";
|
||||
map<string, string>::const_iterator hw_iterator = cpu_info.find("Hardware");
|
||||
|
||||
if (cpu_info.end() != hw_iterator)
|
||||
{
|
||||
hardware_name = hw_iterator->second;
|
||||
}
|
||||
|
||||
return hardware_name;
|
||||
}
|
||||
|
||||
int GetProcessorCount()
|
||||
{
|
||||
FILE* cpuPossible = fopen("/sys/devices/system/cpu/possible", "r");
|
||||
if(!cpuPossible)
|
||||
return 1;
|
||||
|
||||
char buf[2000]; //big enough for 1000 CPUs in worst possible configuration
|
||||
char* pbuf = fgets(buf, sizeof(buf), cpuPossible);
|
||||
fclose(cpuPossible);
|
||||
if(!pbuf)
|
||||
return 1;
|
||||
|
||||
//parse string of form "0-1,3,5-7,10,13-15"
|
||||
int cpusAvailable = 0;
|
||||
|
||||
while(*pbuf)
|
||||
{
|
||||
const char* pos = pbuf;
|
||||
bool range = false;
|
||||
while(*pbuf && *pbuf != ',')
|
||||
{
|
||||
if(*pbuf == '-') range = true;
|
||||
++pbuf;
|
||||
}
|
||||
if(*pbuf) *pbuf++ = 0;
|
||||
if(!range)
|
||||
++cpusAvailable;
|
||||
else
|
||||
{
|
||||
int rstart = 0, rend = 0;
|
||||
sscanf(pos, "%d-%d", &rstart, &rend);
|
||||
cpusAvailable += rend - rstart + 1;
|
||||
}
|
||||
}
|
||||
return cpusAvailable ? cpusAvailable : 1;
|
||||
}
|
||||
|
||||
int DetectKnownPlatforms()
|
||||
{
|
||||
int tegra_status = DetectTegra();
|
||||
|
||||
if (3 == tegra_status)
|
||||
{
|
||||
return PLATFORM_TEGRA3;
|
||||
}
|
||||
else
|
||||
{
|
||||
return PLATFORM_UNKNOWN;
|
||||
}
|
||||
|
||||
// NOTE: Uncomment when all Tegras will be supported
|
||||
/*if (tegra_status > 0)
|
||||
{
|
||||
return PLATFORM_TEGRA + tegra_status - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return PLATFORM_UNKNOWN;
|
||||
}*/
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
#ifndef __HARDWARE_DETECTOR_H__
|
||||
#define __HARDWARE_DETECTOR_H__
|
||||
|
||||
#include <string>
|
||||
|
||||
#define ARCH_UNKNOWN 0L
|
||||
#define ARCH_X86 16777216L
|
||||
#define ARCH_X64 33554432L
|
||||
#define ARCH_ARMv5 67108864L
|
||||
#define ARCH_ARMv6 134217728L
|
||||
#define ARCH_ARMv7 268435456L
|
||||
#define ARCH_ARMv8 536870912L
|
||||
|
||||
#define FEATURES_HAS_VFPv3d16 1L
|
||||
#define FEATURES_HAS_VFPv3 2L
|
||||
#define FEATURES_HAS_NEON 4L
|
||||
#define FEATURES_HAS_NEON2 8L
|
||||
#define FEATURES_HAS_SSE 1L
|
||||
#define FEATURES_HAS_SSE2 2L
|
||||
#define FEATURES_HAS_SSSE3 4L
|
||||
#define FEATURES_HAS_GPU 65536L
|
||||
|
||||
// TODO: Do not forget to add Platrfom name to PackageInfo::PlatformNameMap
|
||||
// in method PackageInfo::InitPlatformNameMap()
|
||||
#define PLATFORM_UNKNOWN 0L
|
||||
#define PLATFORM_TEGRA 1L
|
||||
#define PLATFORM_TEGRA2 2L
|
||||
#define PLATFORM_TEGRA3 3L
|
||||
|
||||
int DetectKnownPlatforms();
|
||||
int GetProcessorCount();
|
||||
std::string GetPlatformName();
|
||||
int GetCpuID();
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,225 @@
|
||||
#include "EngineCommon.h"
|
||||
#include "OpenCVEngine.h"
|
||||
#include "HardwareDetector.h"
|
||||
#include "StringUtils.h"
|
||||
#include <utils/Log.h>
|
||||
#include <assert.h>
|
||||
#include <string>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <dirent.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
using namespace android;
|
||||
|
||||
const int OpenCVEngine::Platform = DetectKnownPlatforms();
|
||||
const int OpenCVEngine::CpuID = GetCpuID();
|
||||
|
||||
std::set<std::string> OpenCVEngine::InitKnownOpenCVersions()
|
||||
{
|
||||
std::set<std::string> result;
|
||||
|
||||
result.insert("240");
|
||||
result.insert("241");
|
||||
result.insert("242");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
const std::set<std::string> OpenCVEngine::KnownVersions = InitKnownOpenCVersions();
|
||||
|
||||
bool OpenCVEngine::ValidateVersionString(const std::string& version)
|
||||
{
|
||||
return (KnownVersions.find(version) != KnownVersions.end());
|
||||
}
|
||||
|
||||
std::string OpenCVEngine::NormalizeVersionString(std::string version)
|
||||
{
|
||||
std::string result = "";
|
||||
std::string suffix = "";
|
||||
|
||||
if (version.empty())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
if (('a' == version[version.size()-1]) || ('b' == version[version.size()-1]))
|
||||
{
|
||||
suffix = version[version.size()-1];
|
||||
version.erase(version.size()-1);
|
||||
}
|
||||
|
||||
std::vector<std::string> parts = SplitStringVector(version, '.');
|
||||
|
||||
if (parts.size() >= 2)
|
||||
{
|
||||
if (parts.size() >= 3)
|
||||
{
|
||||
result = parts[0] + parts[1] + parts[2] + suffix;
|
||||
if (!ValidateVersionString(result))
|
||||
result = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
result = parts[0] + parts[1] + "0" + suffix;
|
||||
if (!ValidateVersionString(result))
|
||||
result = "";
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
OpenCVEngine::OpenCVEngine(IPackageManager* PkgManager):
|
||||
PackageManager(PkgManager)
|
||||
{
|
||||
assert(PkgManager);
|
||||
}
|
||||
|
||||
int32_t OpenCVEngine::GetVersion()
|
||||
{
|
||||
return OPEN_CV_ENGINE_VERSION;
|
||||
}
|
||||
|
||||
String16 OpenCVEngine::GetLibPathByVersion(android::String16 version)
|
||||
{
|
||||
std::string std_version(String8(version).string());
|
||||
std::string norm_version;
|
||||
std::string path;
|
||||
|
||||
LOGD("OpenCVEngine::GetLibPathByVersion(%s) impl", String8(version).string());
|
||||
|
||||
norm_version = NormalizeVersionString(std_version);
|
||||
|
||||
if (!norm_version.empty())
|
||||
{
|
||||
path = PackageManager->GetPackagePathByVersion(norm_version, Platform, CpuID);
|
||||
if (path.empty())
|
||||
{
|
||||
LOGI("Package OpenCV of version %s is not installed. Try to install it :)", norm_version.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
FixPermissions(path);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGE("OpenCV version \"%s\" is not supported", norm_version.c_str());
|
||||
}
|
||||
|
||||
return String16(path.c_str());
|
||||
}
|
||||
|
||||
android::String16 OpenCVEngine::GetLibraryList(android::String16 version)
|
||||
{
|
||||
std::string std_version = String8(version).string();
|
||||
std::string norm_version;
|
||||
String16 result;
|
||||
norm_version = NormalizeVersionString(std_version);
|
||||
|
||||
if (!norm_version.empty())
|
||||
{
|
||||
std::string tmp = PackageManager->GetPackagePathByVersion(norm_version, Platform, CpuID);
|
||||
if (!tmp.empty())
|
||||
{
|
||||
tmp += "/libopencvinfo.so";
|
||||
|
||||
LOGD("Trying to load info library \"%s\"", tmp.c_str());
|
||||
|
||||
void *handle;
|
||||
char* (*info_func)();
|
||||
|
||||
handle = dlopen(tmp.c_str(), RTLD_LAZY);
|
||||
if (handle)
|
||||
{
|
||||
const char *error;
|
||||
|
||||
dlerror();
|
||||
*(void **) (&info_func) = dlsym(handle, "GetLibraryList");
|
||||
if ((error = dlerror()) == NULL)
|
||||
{
|
||||
result = String16((*info_func)());
|
||||
dlclose(handle);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGE("Library loading error: \"%s\"", error);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGI("Info library not found in package");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGI("Package OpenCV of version %s is not installed. Try to install it :)", norm_version.c_str());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGE("OpenCV version \"%s\" is not supported", norm_version.c_str());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool OpenCVEngine::InstallVersion(android::String16 version)
|
||||
{
|
||||
std::string std_version = String8(version).string();
|
||||
std::string norm_version;
|
||||
bool result = false;
|
||||
|
||||
norm_version = NormalizeVersionString(std_version);
|
||||
|
||||
if (!norm_version.empty())
|
||||
{
|
||||
LOGD("OpenCVEngine::InstallVersion() begin");
|
||||
|
||||
if (!PackageManager->CheckVersionInstalled(norm_version, Platform, CpuID))
|
||||
{
|
||||
LOGD("PackageManager->InstallVersion call");
|
||||
result = PackageManager->InstallVersion(norm_version, Platform, CpuID);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGI("Package OpenCV of version %s is already installed. Skiped.", norm_version.c_str());
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGE("OpenCV version \"%s\" is not supported", norm_version.c_str());
|
||||
}
|
||||
|
||||
LOGD("OpenCVEngine::InstallVersion() end");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool OpenCVEngine::FixPermissions(const std::string& path)
|
||||
{
|
||||
LOGD("Fixing permissions for folder: \"%s\"", path.c_str());
|
||||
chmod(path.c_str(), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
|
||||
|
||||
DIR* dir = opendir(path.c_str());
|
||||
if (!dir)
|
||||
{
|
||||
LOGD("Fixing permissions error");
|
||||
return false;
|
||||
}
|
||||
|
||||
dirent* files = readdir(dir);
|
||||
while (files)
|
||||
{
|
||||
LOGD("Fix permissions for \"%s\"", files->d_name);
|
||||
chmod((path + std::string("/") + std::string(files->d_name)).c_str(), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
|
||||
files = readdir(dir);
|
||||
}
|
||||
|
||||
closedir(dir);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
#ifndef __OPEN_CV_ENGINE_H__
|
||||
#define __OPEN_CV_ENGINE_H__
|
||||
|
||||
#include "EngineCommon.h"
|
||||
#include "IOpenCVEngine.h"
|
||||
#include "BnOpenCVEngine.h"
|
||||
#include "IPackageManager.h"
|
||||
#include <binder/IInterface.h>
|
||||
#include <binder/Parcel.h>
|
||||
#include <utils/String8.h>
|
||||
#include <utils/String16.h>
|
||||
#include <string>
|
||||
#include <set>
|
||||
|
||||
class OpenCVEngine: public BnOpenCVEngine
|
||||
{
|
||||
public:
|
||||
OpenCVEngine(IPackageManager* PkgManager);
|
||||
int32_t GetVersion();
|
||||
android::String16 GetLibPathByVersion(android::String16 version);
|
||||
virtual android::String16 GetLibraryList(android::String16 version);
|
||||
bool InstallVersion(android::String16 version);
|
||||
|
||||
protected:
|
||||
IPackageManager* PackageManager;
|
||||
static const std::set<std::string> KnownVersions;
|
||||
|
||||
OpenCVEngine();
|
||||
static std::set<std::string> InitKnownOpenCVersions();
|
||||
bool ValidateVersionString(const std::string& version);
|
||||
std::string NormalizeVersionString(std::string version);
|
||||
bool FixPermissions(const std::string& path);
|
||||
|
||||
static const int Platform;
|
||||
static const int CpuID;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,31 @@
|
||||
#include "ProcReader.h"
|
||||
#include "StringUtils.h"
|
||||
#include <fstream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
map<string, string> GetCpuInfo()
|
||||
{
|
||||
map<string, string> result;
|
||||
ifstream f;
|
||||
|
||||
f.open("/proc/cpuinfo");
|
||||
if (f.is_open())
|
||||
{
|
||||
while (!f.eof())
|
||||
{
|
||||
string tmp;
|
||||
string key;
|
||||
string value;
|
||||
getline(f, tmp);
|
||||
if (ParseString(tmp, key, value))
|
||||
{
|
||||
result[key] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
f.close();
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
#ifndef __PROC_READER_H__
|
||||
#define __PROC_READER_H__
|
||||
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <string>
|
||||
|
||||
#define CPU_INFO_NEON_STR "neon"
|
||||
#define CPU_INFO_NEON2_STR "neon2"
|
||||
#define CPU_INFO_VFPV3_STR "vfpv3"
|
||||
#define CPU_INFO_VFPV3D16_STR "vfpv3d16"
|
||||
|
||||
#define CPU_INFO_SSE_STR "sse"
|
||||
#define CPU_INFO_SSE2_STR "sse2"
|
||||
#define CPU_INFO_SSSE3_STR "ssse3"
|
||||
|
||||
#define CPU_INFO_ARCH_ARMV7_STR "ARMv7"
|
||||
#define CPU_INFO_ARCH_ARMV6_STR "ARMv6"
|
||||
#define CPU_INFO_ARCH_ARMV5_STR "ARMv5"
|
||||
|
||||
#define CPU_INFO_ARCH_X86_STR "x86"
|
||||
|
||||
|
||||
// public part
|
||||
std::map<std::string, std::string> GetCpuInfo();
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,93 @@
|
||||
#include "StringUtils.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
bool StripString(string& src)
|
||||
{
|
||||
size_t pos = 0;
|
||||
|
||||
if (src.empty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
while ((pos < src.length()) && (' ' == src[pos])) pos++;
|
||||
src.erase(0, pos);
|
||||
|
||||
pos = 0;
|
||||
while ((pos < src.length()) && ('\t' == src[pos])) pos++;
|
||||
src.erase(0, pos);
|
||||
|
||||
pos = src.length() - 1;
|
||||
while (pos && (' ' == src[pos])) pos--;
|
||||
src.erase(pos+1);
|
||||
|
||||
pos = src.length() - 1;
|
||||
while (pos && ('\t' == src[pos])) pos--;
|
||||
src.erase(pos+1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ParseString(const string& src, string& key, string& value)
|
||||
{
|
||||
if (src.empty())
|
||||
return false;
|
||||
|
||||
// find seporator ":"
|
||||
size_t seporator_pos = src.find(":");
|
||||
if (string::npos != seporator_pos)
|
||||
{
|
||||
key = src.substr(0, seporator_pos);
|
||||
StripString(key);
|
||||
value = src.substr(seporator_pos+1);
|
||||
StripString(value);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
set<string> SplitString(const string& src, const char seporator)
|
||||
{
|
||||
|
||||
set<string> result;
|
||||
|
||||
if (!src.empty())
|
||||
{
|
||||
size_t seporator_pos;
|
||||
size_t prev_pos = 0;
|
||||
do
|
||||
{
|
||||
seporator_pos = src.find(seporator, prev_pos);
|
||||
result.insert(src.substr(prev_pos, seporator_pos - prev_pos));
|
||||
prev_pos = seporator_pos + 1;
|
||||
}
|
||||
while (string::npos != seporator_pos);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
vector<string> SplitStringVector(const string& src, const char seporator)
|
||||
{
|
||||
vector<string> result;
|
||||
|
||||
if (!src.empty())
|
||||
{
|
||||
size_t seporator_pos;
|
||||
size_t prev_pos = 0;
|
||||
do
|
||||
{
|
||||
seporator_pos = src.find(seporator, prev_pos);
|
||||
string tmp = src.substr(prev_pos, seporator_pos - prev_pos);
|
||||
result.push_back(tmp);
|
||||
prev_pos = seporator_pos + 1;
|
||||
}
|
||||
while (string::npos != seporator_pos);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
#ifndef __STRING_UTILS_H__
|
||||
#define __STRING_UTILS_H__
|
||||
|
||||
#include <string>
|
||||
#include <set>
|
||||
#include <vector>
|
||||
|
||||
bool StripString(std::string& src);
|
||||
std::set<std::string> SplitString(const std::string& src, const char seporator);
|
||||
bool ParseString(const std::string& src, std::string& key, std::string& value);
|
||||
std::vector<std::string> SplitStringVector(const std::string& src, const char seporator);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,53 @@
|
||||
#include "TegraDetector.h"
|
||||
#include <zlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define KERNEL_CONFIG "/proc/config.gz"
|
||||
#define KERNEL_CONFIG_MAX_LINE_WIDTH 512
|
||||
#define KERNEL_CONFIG_TEGRA_MAGIC "CONFIG_ARCH_TEGRA=y"
|
||||
#define KERNEL_CONFIG_TEGRA2_MAGIC "CONFIG_ARCH_TEGRA_2x_SOC=y"
|
||||
#define KERNEL_CONFIG_TEGRA3_MAGIC "CONFIG_ARCH_TEGRA_3x_SOC=y"
|
||||
#define MAX_DATA_LEN 4096
|
||||
|
||||
int DetectTegra()
|
||||
{
|
||||
int result = TEGRA_NOT_TEGRA;
|
||||
gzFile kernelConfig = gzopen(KERNEL_CONFIG, "r");
|
||||
if (kernelConfig != 0)
|
||||
{
|
||||
char tmpbuf[KERNEL_CONFIG_MAX_LINE_WIDTH];
|
||||
const char *tegra_config = KERNEL_CONFIG_TEGRA_MAGIC;
|
||||
const char *tegra2_config = KERNEL_CONFIG_TEGRA2_MAGIC;
|
||||
const char *tegra3_config = KERNEL_CONFIG_TEGRA3_MAGIC;
|
||||
int len = strlen(tegra_config);
|
||||
int len2 = strlen(tegra2_config);
|
||||
int len3 = strlen(tegra3_config);
|
||||
while (0 != gzgets(kernelConfig, tmpbuf, KERNEL_CONFIG_MAX_LINE_WIDTH))
|
||||
{
|
||||
if (0 == strncmp(tmpbuf, tegra_config, len))
|
||||
{
|
||||
result = 1;
|
||||
}
|
||||
|
||||
if (0 == strncmp(tmpbuf, tegra2_config, len2))
|
||||
{
|
||||
result = 2;
|
||||
break;
|
||||
}
|
||||
|
||||
if (0 == strncmp(tmpbuf, tegra3_config, len3))
|
||||
{
|
||||
result = 3;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
gzclose(kernelConfig);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = TEGRA_DETECTOR_ERROR;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
#ifndef __TEGRA_DETECTOR_H__
|
||||
#define __TEGRA_DETECTOR_H__
|
||||
|
||||
#define TEGRA_DETECTOR_ERROR -2
|
||||
#define TEGRA_NOT_TEGRA -1
|
||||
|
||||
int DetectTegra();
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,25 @@
|
||||
#include "HardwareDetector_jni.h"
|
||||
#include "HardwareDetector.h"
|
||||
#include <jni.h>
|
||||
#include <string>
|
||||
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine_manager_HardwareDetector_GetCpuID(JNIEnv* env, jclass)
|
||||
{
|
||||
return GetCpuID();
|
||||
}
|
||||
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine_manager_HardwareDetector_GetPlatformName(JNIEnv* env, jclass)
|
||||
{
|
||||
std::string hardware_name = GetPlatformName();
|
||||
return env->NewStringUTF(hardware_name.c_str());
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine_manager_HardwareDetector_GetProcessorCount(JNIEnv* env, jclass)
|
||||
{
|
||||
return GetProcessorCount();
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine_manager_HardwareDetector_DetectKnownPlatforms(JNIEnv* env, jclass)
|
||||
{
|
||||
return DetectKnownPlatforms();
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||
#include <jni.h>
|
||||
/* Header for class HardwareDetector */
|
||||
|
||||
#ifndef _Included_HardwareDetector
|
||||
#define _Included_HardwareDetector
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Class: org_opencv_engine_manager_HardwareDetector
|
||||
* Method: GetCpuID
|
||||
* Signature: ()I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine_manager_HardwareDetector_GetCpuID
|
||||
(JNIEnv *, jclass);
|
||||
|
||||
/*
|
||||
* Class: org_opencv_engine_manager_HardwareDetector
|
||||
* Method: GetPlatformName
|
||||
* Signature: ()Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jstring JNICALL Java_org_opencv_engine_manager_HardwareDetector_GetPlatformName
|
||||
(JNIEnv *, jclass);
|
||||
|
||||
/*
|
||||
* Class: org_opencv_engine_manager_HardwareDetector
|
||||
* Method: GetProcessorCount
|
||||
* Signature: ()I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine_manager_HardwareDetector_GetProcessorCount
|
||||
(JNIEnv *, jclass);
|
||||
|
||||
/*
|
||||
* Class: org_opencv_engine_manager_HardwareDetector
|
||||
* Method: DetectKnownPlatforms
|
||||
* Signature: ()I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_org_opencv_engine_manager_HardwareDetector_DetectKnownPlatforms
|
||||
(JNIEnv *, jclass);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,176 @@
|
||||
#include "JavaBasedPackageManager.h"
|
||||
#include <utils/Log.h>
|
||||
#include <assert.h>
|
||||
|
||||
#undef LOG_TAG
|
||||
#define LOG_TAG "JavaBasedPackageManager"
|
||||
|
||||
using namespace std;
|
||||
|
||||
JavaBasedPackageManager::JavaBasedPackageManager(JavaVM* JavaMashine, jobject MarketConnector):
|
||||
JavaContext(JavaMashine),
|
||||
JavaPackageManager(MarketConnector)
|
||||
{
|
||||
assert(JavaContext);
|
||||
assert(JavaPackageManager);
|
||||
}
|
||||
|
||||
bool JavaBasedPackageManager::InstallPackage(const PackageInfo& package)
|
||||
{
|
||||
JNIEnv* jenv;
|
||||
bool self_attached;
|
||||
LOGD("JavaBasedPackageManager::InstallPackage() begin\n");
|
||||
|
||||
self_attached = (JNI_EDETACHED == JavaContext->GetEnv((void**)&jenv, JNI_VERSION_1_6));
|
||||
if (self_attached)
|
||||
{
|
||||
JavaContext->AttachCurrentThread(&jenv, NULL);
|
||||
}
|
||||
|
||||
LOGD("GetObjectClass call\n");
|
||||
jclass jclazz = jenv->GetObjectClass(JavaPackageManager);
|
||||
if (!jclazz)
|
||||
{
|
||||
LOGE("MarketConnector class was not found!");
|
||||
return false;
|
||||
}
|
||||
|
||||
LOGD("GetMethodID call\n");
|
||||
jmethodID jmethod = jenv->GetMethodID(jclazz, "InstallAppFromMarket", "(Ljava/lang/String;)Z");
|
||||
if (!jmethod)
|
||||
{
|
||||
LOGE("MarketConnector::GetAppFormMarket method was not found!");
|
||||
return false;
|
||||
}
|
||||
|
||||
LOGD("Calling java package manager with package name %s\n", package.GetFullName().c_str());
|
||||
jobject jpkgname = jenv->NewStringUTF(package.GetFullName().c_str());
|
||||
bool result = jenv->CallNonvirtualBooleanMethod(JavaPackageManager, jclazz, jmethod, jpkgname);
|
||||
|
||||
if (self_attached)
|
||||
{
|
||||
JavaContext->DetachCurrentThread();
|
||||
}
|
||||
|
||||
LOGD("JavaBasedPackageManager::InstallPackage() end\n");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
vector<PackageInfo> JavaBasedPackageManager::GetInstalledPackages()
|
||||
{
|
||||
vector<PackageInfo> result;
|
||||
JNIEnv* jenv;
|
||||
bool self_attached;
|
||||
|
||||
LOGD("JavaBasedPackageManager::GetInstalledPackages() begin");
|
||||
|
||||
self_attached = (JNI_EDETACHED == JavaContext->GetEnv((void**)&jenv, JNI_VERSION_1_6));
|
||||
if (self_attached)
|
||||
{
|
||||
JavaContext->AttachCurrentThread(&jenv, NULL);
|
||||
}
|
||||
|
||||
LOGD("GetObjectClass call");
|
||||
jclass jclazz = jenv->GetObjectClass(JavaPackageManager);
|
||||
if (!jclazz)
|
||||
{
|
||||
LOGE("MarketConnector class was not found!");
|
||||
return result;
|
||||
}
|
||||
|
||||
LOGD("GetMethodID call");
|
||||
jmethodID jmethod = jenv->GetMethodID(jclazz, "GetInstalledOpenCVPackages", "()[Landroid/content/pm/PackageInfo;");
|
||||
if (!jmethod)
|
||||
{
|
||||
LOGE("MarketConnector::GetInstalledOpenCVPackages method was not found!");
|
||||
return result;
|
||||
}
|
||||
|
||||
LOGD("Java package manager call");
|
||||
jobjectArray jpkgs = static_cast<jobjectArray>(jenv->CallNonvirtualObjectMethod(JavaPackageManager, jclazz, jmethod));
|
||||
jsize size = jenv->GetArrayLength(jpkgs);
|
||||
|
||||
LOGD("Package info conversion");
|
||||
|
||||
result.reserve(size);
|
||||
|
||||
for (jsize i = 0; i < size; i++)
|
||||
{
|
||||
jobject jtmp = jenv->GetObjectArrayElement(jpkgs, i);
|
||||
PackageInfo tmp = ConvertPackageFromJava(jtmp, jenv);
|
||||
if (tmp.IsValid())
|
||||
result.push_back(tmp);
|
||||
}
|
||||
|
||||
if (self_attached)
|
||||
{
|
||||
JavaContext->DetachCurrentThread();
|
||||
}
|
||||
|
||||
LOGD("JavaBasedPackageManager::GetInstalledPackages() end");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
PackageInfo JavaBasedPackageManager::ConvertPackageFromJava(jobject package, JNIEnv* jenv)
|
||||
{
|
||||
jclass jclazz = jenv->GetObjectClass(package);
|
||||
jfieldID jfield = jenv->GetFieldID(jclazz, "packageName", "Ljava/lang/String;");
|
||||
jstring jnameobj = static_cast<jstring>(jenv->GetObjectField(package, jfield));
|
||||
const char* jnamestr = jenv->GetStringUTFChars(jnameobj, NULL);
|
||||
string name(jnamestr);
|
||||
|
||||
jfield = jenv->GetFieldID(jclazz, "versionName", "Ljava/lang/String;");
|
||||
jstring jversionobj = static_cast<jstring>(jenv->GetObjectField(package, jfield));
|
||||
const char* jversionstr = jenv->GetStringUTFChars(jversionobj, NULL);
|
||||
string verison(jversionstr);
|
||||
|
||||
string path;
|
||||
jclazz = jenv->FindClass("android/os/Build$VERSION");
|
||||
jfield = jenv->GetStaticFieldID(jclazz, "SDK_INT", "I");
|
||||
jint api_level = jenv->GetStaticIntField(jclazz, jfield);
|
||||
if (api_level > 8)
|
||||
{
|
||||
jclazz = jenv->GetObjectClass(package);
|
||||
jfield = jenv->GetFieldID(jclazz, "applicationInfo", "Landroid/content/pm/ApplicationInfo;");
|
||||
|
||||
jobject japp_info = jenv->GetObjectField(package, jfield);
|
||||
jclazz = jenv->GetObjectClass(japp_info);
|
||||
jfield = jenv->GetFieldID(jclazz, "nativeLibraryDir", "Ljava/lang/String;");
|
||||
jstring jpathobj = static_cast<jstring>(jenv->GetObjectField(japp_info, jfield));
|
||||
|
||||
const char* jpathstr = jenv->GetStringUTFChars(jpathobj, NULL);
|
||||
path = string(jpathstr);
|
||||
jenv->ReleaseStringUTFChars(jpathobj, jpathstr);
|
||||
}
|
||||
else
|
||||
{
|
||||
path = "/data/data/" + name + "/lib";
|
||||
}
|
||||
|
||||
return PackageInfo(name, path, verison);
|
||||
}
|
||||
|
||||
JavaBasedPackageManager::~JavaBasedPackageManager()
|
||||
{
|
||||
JNIEnv* jenv;
|
||||
bool self_attached;
|
||||
|
||||
LOGD("JavaBasedPackageManager::~JavaBasedPackageManager() begin");
|
||||
|
||||
JavaContext->GetEnv((void**)&jenv, JNI_VERSION_1_6);
|
||||
self_attached = (JNI_EDETACHED == JavaContext->GetEnv((void**)&jenv, JNI_VERSION_1_6));
|
||||
if (self_attached)
|
||||
{
|
||||
JavaContext->AttachCurrentThread(&jenv, NULL);
|
||||
}
|
||||
|
||||
jenv->DeleteGlobalRef(JavaPackageManager);
|
||||
|
||||
if (self_attached)
|
||||
{
|
||||
JavaContext->DetachCurrentThread();
|
||||
}
|
||||
LOGD("JavaBasedPackageManager::~JavaBasedPackageManager() end");
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
#include "IPackageManager.h"
|
||||
#include "CommonPackageManager.h"
|
||||
#include <jni.h>
|
||||
#include <vector>
|
||||
|
||||
class JavaBasedPackageManager: public CommonPackageManager
|
||||
{
|
||||
public:
|
||||
JavaBasedPackageManager(JavaVM* JavaMashine, jobject MarketConector);
|
||||
virtual ~JavaBasedPackageManager();
|
||||
|
||||
protected:
|
||||
virtual bool InstallPackage(const PackageInfo& package);
|
||||
virtual std::vector<PackageInfo> GetInstalledPackages();
|
||||
|
||||
private:
|
||||
JavaVM* JavaContext;
|
||||
jobject JavaPackageManager;
|
||||
|
||||
JavaBasedPackageManager();
|
||||
PackageInfo ConvertPackageFromJava(jobject package, JNIEnv* jenv);
|
||||
};
|
||||
@@ -0,0 +1,70 @@
|
||||
#include "OpenCVEngine_jni.h"
|
||||
#include "EngineCommon.h"
|
||||
#include "IOpenCVEngine.h"
|
||||
#include "OpenCVEngine.h"
|
||||
#include "IPackageManager.h"
|
||||
#include "JavaBasedPackageManager.h"
|
||||
#include <utils/Log.h>
|
||||
#include <android_util_Binder.h>
|
||||
|
||||
#undef LOG_TAG
|
||||
#define LOG_TAG "OpenCVEngine/JNI"
|
||||
|
||||
using namespace android;
|
||||
|
||||
sp<IBinder> OpenCVEngineBinder = NULL;
|
||||
IPackageManager* PackageManager = NULL;
|
||||
|
||||
JNIEXPORT jobject JNICALL Java_org_opencv_engine_BinderConnector_Connect(JNIEnv* env, jobject)
|
||||
{
|
||||
LOGI("Creating new component");
|
||||
if (NULL != OpenCVEngineBinder.get())
|
||||
{
|
||||
LOGI("New component created successfully");
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGE("OpenCV Engine component was not created!");
|
||||
}
|
||||
|
||||
return javaObjectForIBinder(env, OpenCVEngineBinder);
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL Java_org_opencv_engine_BinderConnector_Init(JNIEnv* env, jobject thiz, jobject market)
|
||||
{
|
||||
LOGD("Java_org_opencv_engine_BinderConnector_Init");
|
||||
|
||||
if (NULL == PackageManager)
|
||||
{
|
||||
JavaVM* jvm;
|
||||
env->GetJavaVM(&jvm);;
|
||||
PackageManager = new JavaBasedPackageManager(jvm, env->NewGlobalRef(market));
|
||||
}
|
||||
if (PackageManager)
|
||||
{
|
||||
if (!OpenCVEngineBinder.get())
|
||||
{
|
||||
OpenCVEngineBinder = new OpenCVEngine(PackageManager);
|
||||
return (NULL != OpenCVEngineBinder.get());
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_opencv_engine_BinderConnector_Final(JNIEnv *, jobject)
|
||||
{
|
||||
LOGD("Java_org_opencv_engine_BinderConnector_Final");
|
||||
|
||||
OpenCVEngineBinder = NULL;
|
||||
|
||||
delete PackageManager;
|
||||
PackageManager = NULL;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||
#include <jni.h>
|
||||
/* Header for class org_opencv_engine_BinderConnector */
|
||||
|
||||
#ifndef _Included_org_opencv_engine_BinderConnector
|
||||
#define _Included_org_opencv_engine_BinderConnector
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
/*
|
||||
* Class: org_opencv_engine_BinderConnector
|
||||
* Method: Connect
|
||||
* Signature: ()Landroid/os/IBinder;
|
||||
*/
|
||||
JNIEXPORT jobject JNICALL Java_org_opencv_engine_BinderConnector_Connect
|
||||
(JNIEnv *, jobject);
|
||||
|
||||
/*
|
||||
* Class: org_opencv_engine_BinderConnector
|
||||
* Method: Init
|
||||
* Signature: (Lorg/opencv/engine/MarketConnector;)Z
|
||||
*/
|
||||
JNIEXPORT jboolean JNICALL Java_org_opencv_engine_BinderConnector_Init
|
||||
(JNIEnv *, jobject, jobject);
|
||||
|
||||
/*
|
||||
* Class: org_opencv_engine_BinderConnector
|
||||
* Method: Final
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_opencv_engine_BinderConnector_Final
|
||||
(JNIEnv *, jobject);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
@@ -0,0 +1,42 @@
|
||||
#include "EngineCommon.h"
|
||||
#include "IOpenCVEngine.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <grp.h>
|
||||
|
||||
#include <binder/IPCThreadState.h>
|
||||
#include <binder/ProcessState.h>
|
||||
#include <binder/IServiceManager.h>
|
||||
#include <utils/Log.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
using namespace android;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
LOGI("OpenCVEngine client is now starting");
|
||||
|
||||
sp<IServiceManager> ServiceManager = defaultServiceManager();
|
||||
sp<IBinder> EngineService;
|
||||
sp<IOpenCVEngine> Engine;
|
||||
|
||||
LOGI("Trying to contect to service");
|
||||
|
||||
do {
|
||||
EngineService = ServiceManager->getService(IOpenCVEngine::descriptor);
|
||||
if (EngineService != 0) break;
|
||||
LOGW("OpenCVEngine not published, waiting...");
|
||||
usleep(500000); // 0.5 s
|
||||
} while(true);
|
||||
|
||||
LOGI("Connection established");
|
||||
|
||||
Engine = interface_cast<IOpenCVEngine>(EngineService);
|
||||
int32_t EngineVersion = Engine->GetVersion();
|
||||
|
||||
printf("OpenCVEngine version %d started", EngineVersion);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
#include "IOpenCVEngine.h"
|
||||
#include "CommonPackageManager.h"
|
||||
#include "HardwareDetector.h"
|
||||
#include <utils/Log.h>
|
||||
#include <algorithm>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
#undef LOG_TAG
|
||||
#define LOG_TAG "CommonPackageManager"
|
||||
|
||||
using namespace std;
|
||||
|
||||
set<string> CommonPackageManager::GetInstalledVersions()
|
||||
{
|
||||
set<string> result;
|
||||
vector<PackageInfo> installed_packages = GetInstalledPackages();
|
||||
|
||||
for (vector<PackageInfo>::const_iterator it = installed_packages.begin(); it != installed_packages.end(); ++it)
|
||||
{
|
||||
string version = it->GetVersion();
|
||||
assert(!version.empty());
|
||||
result.insert(version);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool CommonPackageManager::CheckVersionInstalled(const std::string& version, int platform, int cpu_id)
|
||||
{
|
||||
bool result = false;
|
||||
LOGD("CommonPackageManager::CheckVersionInstalled() begin");
|
||||
PackageInfo target_package(version, platform, cpu_id);
|
||||
LOGD("GetInstalledPackages() call");
|
||||
vector<PackageInfo> packages = GetInstalledPackages();
|
||||
|
||||
for (vector<PackageInfo>::const_iterator it = packages.begin(); it != packages.end(); ++it)
|
||||
{
|
||||
LOGD("Found package: \"%s\"", it->GetFullName().c_str());
|
||||
}
|
||||
|
||||
if (!packages.empty())
|
||||
{
|
||||
result = (packages.end() != find(packages.begin(), packages.end(), target_package));
|
||||
}
|
||||
LOGD("CommonPackageManager::CheckVersionInstalled() end");
|
||||
return result;
|
||||
}
|
||||
|
||||
bool CommonPackageManager::InstallVersion(const std::string& version, int platform, int cpu_id)
|
||||
{
|
||||
LOGD("CommonPackageManager::InstallVersion() begin");
|
||||
PackageInfo package(version, platform, cpu_id);
|
||||
return InstallPackage(package);
|
||||
}
|
||||
|
||||
string CommonPackageManager::GetPackagePathByVersion(const std::string& version, int platform, int cpu_id)
|
||||
{
|
||||
string result;
|
||||
PackageInfo target_package(version, platform, cpu_id);
|
||||
vector<PackageInfo> all_packages = GetInstalledPackages();
|
||||
vector<PackageInfo> packages;
|
||||
|
||||
for (vector<PackageInfo>::iterator it = all_packages.begin(); it != all_packages.end(); ++it)
|
||||
{
|
||||
if (IsVersionCompatible(version, it->GetVersion()))
|
||||
{
|
||||
packages.push_back(*it);
|
||||
}
|
||||
}
|
||||
|
||||
if (!packages.empty())
|
||||
{
|
||||
vector<PackageInfo>::iterator found = find(packages.begin(), packages.end(), target_package);
|
||||
if (packages.end() != found)
|
||||
{
|
||||
result = found->GetInstalationPath();
|
||||
}
|
||||
else
|
||||
{
|
||||
int OptRating = -1;
|
||||
std::vector<std::pair<int, int> >& group = CommonPackageManager::ArmRating;
|
||||
|
||||
if ((cpu_id & ARCH_X86) || (cpu_id & ARCH_X64))
|
||||
group = CommonPackageManager::IntelRating;
|
||||
|
||||
int HardwareRating = GetHardwareRating(platform, cpu_id, group);
|
||||
|
||||
if (-1 == HardwareRating)
|
||||
{
|
||||
LOGE("Cannot calculate rating for current hardware platfrom!");
|
||||
}
|
||||
else
|
||||
{
|
||||
for (vector<PackageInfo>::iterator it = packages.begin(); it != packages.end(); ++it)
|
||||
{
|
||||
int PackageRating = GetHardwareRating(it->GetPlatform(), it->GetCpuID(), group);
|
||||
if (PackageRating >= 0)
|
||||
{
|
||||
if ((PackageRating <= HardwareRating) && (PackageRating > OptRating))
|
||||
{
|
||||
OptRating = PackageRating;
|
||||
found = it;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((-1 != OptRating) && (packages.end() != found))
|
||||
{
|
||||
result = found->GetInstalationPath();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool CommonPackageManager::IsVersionCompatible(const std::string& target_version, const std::string& package_version)
|
||||
{
|
||||
assert (target_version.size() == 3);
|
||||
assert (package_version.size() == 3);
|
||||
|
||||
bool result = false;
|
||||
|
||||
// major version is the same and minor package version is above or the same as target.
|
||||
if ((package_version[0] == target_version[0]) && (package_version[1] == target_version[1]) && (package_version[2] >= target_version[2]))
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int CommonPackageManager::GetHardwareRating(int platform, int cpu_id, const std::vector<std::pair<int, int> >& group)
|
||||
{
|
||||
int result = -1;
|
||||
|
||||
for (size_t i = 0; i < group.size(); i++)
|
||||
{
|
||||
if (group[i] == std::pair<int, int>(platform, cpu_id))
|
||||
{
|
||||
result = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
std::vector<std::pair<int, int> > CommonPackageManager::InitArmRating()
|
||||
{
|
||||
std::vector<std::pair<int, int> > result;
|
||||
|
||||
result.push_back(std::pair<int, int>(PLATFORM_UNKNOWN, ARCH_ARMv5));
|
||||
result.push_back(std::pair<int, int>(PLATFORM_UNKNOWN, ARCH_ARMv6));
|
||||
result.push_back(std::pair<int, int>(PLATFORM_UNKNOWN, ARCH_ARMv6 | FEATURES_HAS_VFPv3d16));
|
||||
result.push_back(std::pair<int, int>(PLATFORM_UNKNOWN, ARCH_ARMv6 | FEATURES_HAS_VFPv3));
|
||||
result.push_back(std::pair<int, int>(PLATFORM_UNKNOWN, ARCH_ARMv7));
|
||||
result.push_back(std::pair<int, int>(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3));
|
||||
result.push_back(std::pair<int, int>(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_NEON));
|
||||
result.push_back(std::pair<int, int>(PLATFORM_TEGRA2, ARCH_ARMv7 | FEATURES_HAS_VFPv3));
|
||||
result.push_back(std::pair<int, int>(PLATFORM_TEGRA3, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_NEON));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
std::vector<std::pair<int, int> > CommonPackageManager::InitIntelRating()
|
||||
{
|
||||
std::vector<std::pair<int, int> > result;
|
||||
|
||||
result.push_back(std::pair<int, int>(PLATFORM_UNKNOWN, ARCH_X64));
|
||||
result.push_back(std::pair<int, int>(PLATFORM_UNKNOWN, ARCH_X86 | FEATURES_HAS_SSSE3));
|
||||
result.push_back(std::pair<int, int>(PLATFORM_UNKNOWN, ARCH_X86 | FEATURES_HAS_SSE2));
|
||||
result.push_back(std::pair<int, int>(PLATFORM_UNKNOWN, ARCH_X86 | FEATURES_HAS_SSE));
|
||||
result.push_back(std::pair<int, int>(PLATFORM_UNKNOWN, ARCH_X86));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
std::vector<std::pair<int, int> > CommonPackageManager::IntelRating = CommonPackageManager::InitIntelRating();
|
||||
std::vector<std::pair<int, int> > CommonPackageManager::ArmRating = InitArmRating();
|
||||
|
||||
CommonPackageManager::~CommonPackageManager()
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
#ifndef __COMMON_PACKAGE_MANAGER_H__
|
||||
#define __COMMON_PACKAGE_MANAGER_H__
|
||||
|
||||
#include "IPackageManager.h"
|
||||
#include "PackageInfo.h"
|
||||
#include <set>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
class CommonPackageManager: public IPackageManager
|
||||
{
|
||||
public:
|
||||
std::set<std::string> GetInstalledVersions();
|
||||
bool CheckVersionInstalled(const std::string& version, int platform, int cpu_id);
|
||||
bool InstallVersion(const std::string& version, int platform, int cpu_id);
|
||||
std::string GetPackagePathByVersion(const std::string& version, int platform, int cpu_id);
|
||||
virtual ~CommonPackageManager();
|
||||
|
||||
protected:
|
||||
static std::vector<std::pair<int, int> > ArmRating;
|
||||
static std::vector<std::pair<int, int> > IntelRating;
|
||||
|
||||
static std::vector<std::pair<int, int> > InitArmRating();
|
||||
static std::vector<std::pair<int, int> > InitIntelRating();
|
||||
|
||||
bool IsVersionCompatible(const std::string& target_version, const std::string& package_version);
|
||||
int GetHardwareRating(int platform, int cpu_id, const std::vector<std::pair<int, int> >& group);
|
||||
|
||||
virtual bool InstallPackage(const PackageInfo& package) = 0;
|
||||
virtual std::vector<PackageInfo> GetInstalledPackages() = 0;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,19 @@
|
||||
#include "NativePackageManager.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
bool NativePackageManager::InstallPackage(const PackageInfo& package)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
vector<PackageInfo> NativePackageManager::GetInstalledPackages()
|
||||
{
|
||||
vector<PackageInfo> result;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
NativePackageManager::~NativePackageManager()
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
#ifndef __NATIVE_PACKAGE_MANAGER_STUB_H__
|
||||
#define __NATIVE_PACKAGE_MANAGER_STUB_H__
|
||||
|
||||
#include "IPackageManager.h"
|
||||
#include "CommonPackageManager.h"
|
||||
|
||||
class NativePackageManager: public CommonPackageManager
|
||||
{
|
||||
public:
|
||||
virtual ~NativePackageManager();
|
||||
protected:
|
||||
virtual bool InstallPackage(const PackageInfo& package);
|
||||
virtual std::vector<PackageInfo> GetInstalledPackages();
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,391 @@
|
||||
#include "EngineCommon.h"
|
||||
#include "PackageInfo.h"
|
||||
#include "HardwareDetector.h"
|
||||
#include "IOpenCVEngine.h"
|
||||
#include "StringUtils.h"
|
||||
#include <assert.h>
|
||||
#include <vector>
|
||||
#include <utils/Log.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
map<int, string> PackageInfo::InitPlatformNameMap()
|
||||
{
|
||||
map<int, string> result;
|
||||
|
||||
// TODO: Do not forget to add Platrfom constant to HardwareDetector.h
|
||||
result[PLATFORM_TEGRA] = PLATFORM_TEGRA_NAME;
|
||||
result[PLATFORM_TEGRA2] = PLATFORM_TEGRA2_NAME;
|
||||
result[PLATFORM_TEGRA3] = PLATFORM_TEGRA3_NAME;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
const map<int, string> PackageInfo::PlatformNameMap = InitPlatformNameMap();
|
||||
const string PackageInfo::BasePackageName = "org.opencv.lib";
|
||||
|
||||
inline string JoinARMFeatures(int cpu_id)
|
||||
{
|
||||
string result;
|
||||
|
||||
if (FEATURES_HAS_NEON2 & cpu_id)
|
||||
{
|
||||
result = string(FEATURES_HAS_NEON2_NAME);
|
||||
}
|
||||
else if (FEATURES_HAS_NEON & cpu_id)
|
||||
{
|
||||
result = string(FEATURES_HAS_NEON_NAME);
|
||||
}
|
||||
else if (FEATURES_HAS_VFPv3 & cpu_id)
|
||||
{
|
||||
result = string(FEATURES_HAS_VFPv3_NAME);
|
||||
}
|
||||
else if (FEATURES_HAS_VFPv3d16 & cpu_id)
|
||||
{
|
||||
result = string(FEATURES_HAS_VFPv3d16_NAME);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
inline int SplitARMFeatures(const vector<string>& features)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
for (size_t i = 3; i < features.size(); i++)
|
||||
{
|
||||
if (FEATURES_HAS_VFPv3_NAME == features[i])
|
||||
{
|
||||
result |= FEATURES_HAS_VFPv3;
|
||||
}
|
||||
else if (FEATURES_HAS_VFPv3d16_NAME == features[i])
|
||||
{
|
||||
result |= FEATURES_HAS_VFPv3d16;
|
||||
}
|
||||
else if (FEATURES_HAS_NEON_NAME == features[i])
|
||||
{
|
||||
result |= FEATURES_HAS_NEON;
|
||||
}
|
||||
else if (FEATURES_HAS_NEON2_NAME == features[i])
|
||||
{
|
||||
result |= FEATURES_HAS_NEON2;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
inline string JoinIntelFeatures(int cpu_id)
|
||||
{
|
||||
string result;
|
||||
|
||||
if (FEATURES_HAS_SSSE3 & cpu_id)
|
||||
{
|
||||
result = FEATURES_HAS_SSSE3_NAME;
|
||||
}
|
||||
else if (FEATURES_HAS_SSE2 & cpu_id)
|
||||
{
|
||||
result = FEATURES_HAS_SSE2_NAME;
|
||||
}
|
||||
else if (FEATURES_HAS_SSE & cpu_id)
|
||||
{
|
||||
result = FEATURES_HAS_SSE_NAME;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
inline int SplitIntelFeatures(const vector<string>& features)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
for (size_t i = 3; i < features.size(); i++)
|
||||
{
|
||||
if (FEATURES_HAS_SSSE3_NAME == features[i])
|
||||
{
|
||||
result |= FEATURES_HAS_SSSE3;
|
||||
}
|
||||
else if (FEATURES_HAS_SSE2_NAME == features[i])
|
||||
{
|
||||
result |= FEATURES_HAS_SSE2;
|
||||
}
|
||||
else if (FEATURES_HAS_SSE_NAME == features[i])
|
||||
{
|
||||
result |= FEATURES_HAS_SSE;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
inline string SplitVersion(const vector<string>& features, const string& package_version)
|
||||
{
|
||||
string result;
|
||||
|
||||
if ((features.size() > 1) && ('v' == features[1][0]))
|
||||
{
|
||||
result = features[1].substr(1);
|
||||
result += SplitStringVector(package_version, '.')[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO: Report package name format error
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
inline string JoinPlatform(int platform)
|
||||
{
|
||||
string result;
|
||||
map<int, string>::const_iterator it = PackageInfo::PlatformNameMap.find(platform);
|
||||
|
||||
assert(PackageInfo::PlatformNameMap.end() != it);
|
||||
result = it->second;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
inline int SplitPlatfrom(const vector<string>& features)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
if (features.size() > 2)
|
||||
{
|
||||
string tmp = features[2];
|
||||
if (PLATFORM_TEGRA_NAME == tmp)
|
||||
{
|
||||
result = PLATFORM_TEGRA;
|
||||
}
|
||||
else if (PLATFORM_TEGRA2_NAME == tmp)
|
||||
{
|
||||
result = PLATFORM_TEGRA2;
|
||||
}
|
||||
else if (PLATFORM_TEGRA3_NAME == tmp)
|
||||
{
|
||||
result = PLATFORM_TEGRA3;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO: Report package name format error
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Package naming convention
|
||||
* All parts of package name seporated by "_" symbol
|
||||
* First part is base namespace.
|
||||
* Second part is version. Version starts from "v" symbol. After "v" symbol version nomber without dot symbol added.
|
||||
* If platform is known third part is platform name
|
||||
* If platform is unknown it is defined by hardware capabilities using pattern: <arch>_<fpu features>_<vectorisation features>_<other features>
|
||||
* Example: armv7_vfpv3_neon, armv7_vfpv3d16_neon
|
||||
*/
|
||||
PackageInfo::PackageInfo(const string& version, int platform, int cpu_id):
|
||||
Version(version),
|
||||
Platform(platform),
|
||||
CpuID(cpu_id),
|
||||
InstallPath("")
|
||||
{
|
||||
FullName = BasePackageName + "_v" + Version.substr(0, Version.size()-1);
|
||||
if (PLATFORM_UNKNOWN != Platform)
|
||||
{
|
||||
FullName += string("_") + JoinPlatform(platform);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ARCH_UNKNOWN != CpuID)
|
||||
{
|
||||
if (ARCH_X86 & CpuID)
|
||||
{
|
||||
LOGD("Found processor with x86 arch");
|
||||
FullName += string("_") + ARCH_X86_NAME;
|
||||
// NOTE: Intel features temporary are not supported
|
||||
//string features = JoinIntelFeatures(CpuID);
|
||||
string features;
|
||||
if (!features.empty())
|
||||
{
|
||||
FullName += string("_") + features;
|
||||
}
|
||||
}
|
||||
if (ARCH_X64 & CpuID)
|
||||
{
|
||||
LOGD("Found processor with x64 arch");
|
||||
// NOTE: Intel features temporary are not supported
|
||||
//FullName += string("_") + ARCH_X64_NAME;
|
||||
//string features = JoinIntelFeatures(CpuID);
|
||||
FullName += string("_") + ARCH_X86_NAME;
|
||||
string features;
|
||||
if (!features.empty())
|
||||
{
|
||||
FullName += string("_") + features;
|
||||
}
|
||||
}
|
||||
if (ARCH_ARMv5 & CpuID)
|
||||
{
|
||||
LOGD("Found processor with ARMv5 arch");
|
||||
FullName += string("_") + ARCH_ARMv5_NAME;
|
||||
string features = JoinARMFeatures(CpuID);
|
||||
if (!features.empty())
|
||||
{
|
||||
FullName += string("_") + features;
|
||||
}
|
||||
}
|
||||
if (ARCH_ARMv6 & CpuID)
|
||||
{
|
||||
LOGD("Found processor with ARMv6 arch");
|
||||
// NOTE: ARM v6 used instead ARM v6
|
||||
//FullName += string("_") + ARCH_ARMv6_NAME;
|
||||
FullName += string("_") + ARCH_ARMv5_NAME;
|
||||
// NOTE: ARM features temporary are not supported
|
||||
//string features = JoinARMFeatures(CpuID);
|
||||
string features;
|
||||
if (!features.empty())
|
||||
{
|
||||
FullName += string("_") + features;
|
||||
}
|
||||
}
|
||||
if (ARCH_ARMv7 & CpuID)
|
||||
{
|
||||
LOGD("Found processor with ARMv7 arch");
|
||||
FullName += string("_") + ARCH_ARMv7_NAME;
|
||||
// NOTE: ARM features temporary are not supported
|
||||
//string features = JoinARMFeatures(CpuID);
|
||||
string features;
|
||||
if (!features.empty())
|
||||
{
|
||||
FullName += string("_") + features;
|
||||
}
|
||||
}
|
||||
if (ARCH_ARMv8 & CpuID)
|
||||
{
|
||||
LOGD("Found processor with ARMv8 arch");
|
||||
FullName += string("_") + ARCH_ARMv8_NAME;
|
||||
string features = JoinARMFeatures(CpuID);
|
||||
if (!features.empty())
|
||||
{
|
||||
FullName += string("_") + features;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGD("Found processor with unknown arch");
|
||||
Version.clear();
|
||||
CpuID = ARCH_UNKNOWN;
|
||||
Platform = PLATFORM_UNKNOWN;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PackageInfo::PackageInfo(const string& fullname, const string& install_path, const string& package_version):
|
||||
FullName(fullname),
|
||||
InstallPath(install_path)
|
||||
{
|
||||
LOGD("PackageInfo::PackageInfo(\"%s\", \"%s\")", fullname.c_str(), install_path.c_str());
|
||||
|
||||
assert(!fullname.empty());
|
||||
assert(!install_path.empty());
|
||||
|
||||
vector<string> features = SplitStringVector(FullName, '_');
|
||||
|
||||
if (!features.empty() && (BasePackageName == features[0]))
|
||||
{
|
||||
Version = SplitVersion(features, package_version);
|
||||
if (Version.empty())
|
||||
{
|
||||
CpuID = ARCH_UNKNOWN;
|
||||
Platform = PLATFORM_UNKNOWN;
|
||||
return;
|
||||
}
|
||||
|
||||
Platform = SplitPlatfrom(features);
|
||||
if (PLATFORM_UNKNOWN != Platform)
|
||||
{
|
||||
CpuID = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (features.size() < 3)
|
||||
{
|
||||
LOGD("It is not OpenCV library package for this platform");
|
||||
Version.clear();
|
||||
CpuID = ARCH_UNKNOWN;
|
||||
Platform = PLATFORM_UNKNOWN;
|
||||
return;
|
||||
}
|
||||
else if (ARCH_ARMv5_NAME == features[2])
|
||||
{
|
||||
CpuID = ARCH_ARMv5 | SplitARMFeatures(features);
|
||||
}
|
||||
else if (ARCH_ARMv6_NAME == features[2])
|
||||
{
|
||||
CpuID = ARCH_ARMv6 | SplitARMFeatures(features);
|
||||
}
|
||||
else if (ARCH_ARMv7_NAME == features[2])
|
||||
{
|
||||
CpuID = ARCH_ARMv7 | SplitARMFeatures(features);
|
||||
}
|
||||
else if (ARCH_X86_NAME == features[2])
|
||||
{
|
||||
CpuID = ARCH_X86 | SplitIntelFeatures(features);
|
||||
}
|
||||
else if (ARCH_X64_NAME == features[2])
|
||||
{
|
||||
CpuID = ARCH_X64 | SplitIntelFeatures(features);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGD("It is not OpenCV library package for this platform");
|
||||
Version.clear();
|
||||
CpuID = ARCH_UNKNOWN;
|
||||
Platform = PLATFORM_UNKNOWN;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGD("It is not OpenCV library package for this platform");
|
||||
Version.clear();
|
||||
CpuID = ARCH_UNKNOWN;
|
||||
Platform = PLATFORM_UNKNOWN;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
bool PackageInfo::IsValid() const
|
||||
{
|
||||
return !(Version.empty() && (PLATFORM_UNKNOWN == Platform) && (ARCH_UNKNOWN == CpuID));
|
||||
}
|
||||
|
||||
int PackageInfo::GetPlatform() const
|
||||
{
|
||||
return Platform;
|
||||
}
|
||||
|
||||
int PackageInfo::GetCpuID() const
|
||||
{
|
||||
return CpuID;
|
||||
}
|
||||
|
||||
string PackageInfo::GetFullName() const
|
||||
{
|
||||
return FullName;
|
||||
}
|
||||
|
||||
string PackageInfo::GetVersion() const
|
||||
{
|
||||
return Version;
|
||||
}
|
||||
|
||||
string PackageInfo::GetInstalationPath() const
|
||||
{
|
||||
return InstallPath;
|
||||
}
|
||||
|
||||
bool PackageInfo::operator==(const PackageInfo& package) const
|
||||
{
|
||||
return (package.FullName == FullName);
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
#ifndef __PACKAGE_INFO_H__
|
||||
#define __PACKAGE_INFO_H__
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
#define ARCH_X86_NAME "x86"
|
||||
#define ARCH_X64_NAME "x64"
|
||||
#define ARCH_ARMv5_NAME "armv5"
|
||||
#define ARCH_ARMv6_NAME "armv6"
|
||||
#define ARCH_ARMv7_NAME "armv7a"
|
||||
#define ARCH_ARMv8_NAME "armv8"
|
||||
|
||||
#define FEATURES_HAS_VFPv3d16_NAME "vfpv3d16"
|
||||
#define FEATURES_HAS_VFPv3_NAME "vfpv3"
|
||||
#define FEATURES_HAS_NEON_NAME "neon"
|
||||
#define FEATURES_HAS_NEON2_NAME "neon2"
|
||||
#define FEATURES_HAS_SSE_NAME "sse"
|
||||
#define FEATURES_HAS_SSE2_NAME "sse2"
|
||||
#define FEATURES_HAS_SSSE3_NAME "ssse3"
|
||||
#define FEATURES_HAS_GPU_NAME "gpu"
|
||||
|
||||
#define PLATFORM_TEGRA_NAME "tegra"
|
||||
#define PLATFORM_TEGRA2_NAME "tegra2"
|
||||
#define PLATFORM_TEGRA3_NAME "tegra3"
|
||||
|
||||
|
||||
class PackageInfo
|
||||
{
|
||||
public:
|
||||
PackageInfo(const std::string& version, int platform, int cpu_id);
|
||||
PackageInfo(const std::string& fullname, const std::string& install_path, const std::string& package_version = "0.0");
|
||||
std::string GetFullName() const;
|
||||
std::string GetVersion() const;
|
||||
int GetPlatform() const;
|
||||
int GetCpuID() const;
|
||||
std::string GetInstalationPath() const;
|
||||
bool operator==(const PackageInfo& package) const;
|
||||
static const std::map<int, std::string> PlatformNameMap;
|
||||
bool IsValid() const;
|
||||
|
||||
protected:
|
||||
static std::map<int, std::string> InitPlatformNameMap();
|
||||
std::string Version;
|
||||
int Platform;
|
||||
int CpuID;
|
||||
std::string FullName;
|
||||
std::string InstallPath;
|
||||
static const std::string BasePackageName;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,32 @@
|
||||
#include "EngineCommon.h"
|
||||
#include "IOpenCVEngine.h"
|
||||
#include "OpenCVEngine.h"
|
||||
#include "IPackageManager.h"
|
||||
#include "NativePackageManager.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <grp.h>
|
||||
#include <binder/IPCThreadState.h>
|
||||
#include <binder/ProcessState.h>
|
||||
#include <binder/IServiceManager.h>
|
||||
#include <utils/Log.h>
|
||||
|
||||
using namespace android;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
LOGI("OpenCVEngine native service starting");
|
||||
IPackageManager* PackageManager = new NativePackageManager();
|
||||
sp<IBinder> Engine = new OpenCVEngine(PackageManager);
|
||||
|
||||
defaultServiceManager()->addService(IOpenCVEngine::descriptor, Engine);
|
||||
LOGI("OpenCVEngine native service started successfully");
|
||||
ProcessState::self()->startThreadPool();
|
||||
IPCThreadState::self()->joinThreadPool();
|
||||
LOGI("OpenCVEngine native service finished");
|
||||
|
||||
delete PackageManager;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include "ProcReader.h"
|
||||
#include "TegraDetector.h"
|
||||
#include "HardwareDetector.h"
|
||||
#include "StringUtils.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
TEST(Strip, StripEmptyString)
|
||||
{
|
||||
string a = "";
|
||||
EXPECT_FALSE(StripString(a));
|
||||
}
|
||||
|
||||
TEST(Strip, StripClearString)
|
||||
{
|
||||
string a = "qqqwww";
|
||||
EXPECT_TRUE(StripString(a));
|
||||
EXPECT_STREQ("qqqwww", a.c_str());
|
||||
}
|
||||
|
||||
TEST(Strip, StripStringLeft)
|
||||
{
|
||||
string a = " qqqwww";
|
||||
EXPECT_TRUE(StripString(a));
|
||||
EXPECT_STREQ("qqqwww", a.c_str());
|
||||
}
|
||||
|
||||
TEST(Strip, StripStringRight)
|
||||
{
|
||||
string a = "qqqwww ";
|
||||
EXPECT_TRUE(StripString(a));
|
||||
EXPECT_STREQ("qqqwww", a.c_str());
|
||||
}
|
||||
|
||||
TEST(Strip, StripStringLeftRight)
|
||||
{
|
||||
string a = "qqqwww ";
|
||||
EXPECT_TRUE(StripString(a));
|
||||
EXPECT_STREQ("qqqwww", a.c_str());
|
||||
}
|
||||
|
||||
TEST(Strip, StripStringWithSpaces)
|
||||
{
|
||||
string a = " qqq www ";
|
||||
EXPECT_TRUE(StripString(a));
|
||||
EXPECT_STREQ("qqq www", a.c_str());
|
||||
}
|
||||
|
||||
TEST(Parse, ParseEmptyString)
|
||||
{
|
||||
string a = "";
|
||||
string key;
|
||||
string value;
|
||||
EXPECT_FALSE(ParseString(a, key, value));
|
||||
}
|
||||
|
||||
TEST(Parse, ParseStringWithoutSeporator)
|
||||
{
|
||||
string a = "qqqwww";
|
||||
string key;
|
||||
string value;
|
||||
EXPECT_FALSE(ParseString(a, key, value));
|
||||
}
|
||||
|
||||
TEST(Parse, ParseClearString)
|
||||
{
|
||||
string a = "qqq:www";
|
||||
string key;
|
||||
string value;
|
||||
EXPECT_TRUE(ParseString(a, key, value));
|
||||
EXPECT_STREQ("qqq", key.c_str());
|
||||
EXPECT_STREQ("www", value.c_str());
|
||||
}
|
||||
|
||||
TEST(Parse, ParseDirtyString)
|
||||
{
|
||||
string a = "qqq : www";
|
||||
string key;
|
||||
string value;
|
||||
EXPECT_TRUE(ParseString(a, key, value));
|
||||
EXPECT_STREQ("qqq", key.c_str());
|
||||
EXPECT_STREQ("www", value.c_str());
|
||||
}
|
||||
|
||||
TEST(Split, SplitEmptyString)
|
||||
{
|
||||
string a = "";
|
||||
set<string> b = SplitString(a, ' ');
|
||||
EXPECT_EQ(0, b.size());
|
||||
}
|
||||
|
||||
TEST(Split, SplitOneElementString)
|
||||
{
|
||||
string a = "qqq";
|
||||
set<string> b = SplitString(a, ' ');
|
||||
EXPECT_EQ(1, b.size());
|
||||
EXPECT_FALSE(b.find("qqq") == b.end());
|
||||
}
|
||||
|
||||
TEST(Split, SplitMultiElementString)
|
||||
{
|
||||
string a = "qqq www eee";
|
||||
set<string> b = SplitString(a, ' ');
|
||||
EXPECT_EQ(3, b.size());
|
||||
EXPECT_FALSE(b.find("qqq") == b.end());
|
||||
EXPECT_FALSE(b.find("www") == b.end());
|
||||
EXPECT_FALSE(b.find("eee") == b.end());
|
||||
}
|
||||
|
||||
TEST(GetCpuInfo, GetCpuInfo)
|
||||
{
|
||||
map<string, string> a = GetCpuInfo();
|
||||
EXPECT_FALSE(a.empty());
|
||||
EXPECT_TRUE(a.find("") == a.end());
|
||||
}
|
||||
|
||||
TEST(TegraDetector, Detect)
|
||||
{
|
||||
EXPECT_TRUE(DetectTegra() != 0);
|
||||
}
|
||||
|
||||
TEST(CpuCount, CheckNonZero)
|
||||
{
|
||||
EXPECT_TRUE(GetProcessorCount() != 0);
|
||||
}
|
||||
|
||||
TEST(CpuID, CheckNotEmpy)
|
||||
{
|
||||
int cpu_id = GetCpuID();
|
||||
EXPECT_NE(0, cpu_id);
|
||||
}
|
||||
|
||||
TEST(CpuID, CheckArmV7)
|
||||
{
|
||||
int cpu_id = GetCpuID();
|
||||
EXPECT_TRUE(cpu_id & ARCH_ARMv7);
|
||||
}
|
||||
|
||||
TEST(CpuID, CheckNeon)
|
||||
{
|
||||
int cpu_id = GetCpuID();
|
||||
EXPECT_TRUE(cpu_id & FEATURES_HAS_NEON);
|
||||
}
|
||||
|
||||
TEST(CpuID, CheckVFPv3)
|
||||
{
|
||||
int cpu_id = GetCpuID();
|
||||
EXPECT_TRUE(cpu_id & FEATURES_HAS_VFPv3);
|
||||
}
|
||||
|
||||
TEST(PlatfromDetector, CheckTegra)
|
||||
{
|
||||
EXPECT_NE(PLATFORM_UNKNOWN, DetectKnownPlatforms());
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
#include "IOpenCVEngine.h"
|
||||
#include "EngineCommon.h"
|
||||
#include "OpenCVEngine.h"
|
||||
#include "IPackageManager.h"
|
||||
#include "PackageManagerStub.h"
|
||||
#include "PackageInfo.h"
|
||||
#include "HardwareDetector.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <binder/IPCThreadState.h>
|
||||
#include <binder/ProcessState.h>
|
||||
#include <binder/IServiceManager.h>
|
||||
#include <utils/Log.h>
|
||||
|
||||
using namespace android;
|
||||
|
||||
class ServiceStarter
|
||||
{
|
||||
public:
|
||||
ServiceStarter()
|
||||
{
|
||||
PackageManager = new PackageManagerStub();
|
||||
PackageInfo info("230", PLATFORM_UNKNOWN, ARCH_ARMv7);
|
||||
PackageManager->InstalledPackages.push_back(info);
|
||||
|
||||
Engine = new OpenCVEngine(PackageManager);
|
||||
|
||||
defaultServiceManager()->addService(IOpenCVEngine::descriptor, Engine);
|
||||
LOGI("OpenCVEngine native service started successfully");
|
||||
ProcessState::self()->startThreadPool();
|
||||
}
|
||||
~ServiceStarter()
|
||||
{
|
||||
delete PackageManager;
|
||||
}
|
||||
private:
|
||||
PackageManagerStub* PackageManager;
|
||||
sp<IBinder> Engine;
|
||||
};
|
||||
|
||||
static ServiceStarter Starter;
|
||||
|
||||
sp<IOpenCVEngine> InitConnect()
|
||||
{
|
||||
sp<IServiceManager> ServiceManager = defaultServiceManager();
|
||||
sp<IBinder> EngineService;
|
||||
sp<IOpenCVEngine> Engine;
|
||||
|
||||
do
|
||||
{
|
||||
EngineService = ServiceManager->getService(IOpenCVEngine::descriptor);
|
||||
if (EngineService != 0) break;
|
||||
usleep(500000); // 0.5 s
|
||||
} while(true);
|
||||
|
||||
Engine = interface_cast<IOpenCVEngine>(EngineService);
|
||||
|
||||
return Engine;
|
||||
}
|
||||
|
||||
TEST(OpenCVEngineTest, GetVersion)
|
||||
{
|
||||
sp<IOpenCVEngine> Engine = InitConnect();
|
||||
EXPECT_FALSE(NULL == Engine.get());
|
||||
int32_t Version = Engine->GetVersion();
|
||||
EXPECT_EQ(OPEN_CV_ENGINE_VERSION, Version);
|
||||
}
|
||||
|
||||
TEST(OpenCVEngineTest, InstallVersion)
|
||||
{
|
||||
sp<IOpenCVEngine> Engine = InitConnect();
|
||||
EXPECT_FALSE(NULL == Engine.get());
|
||||
bool result = Engine->InstallVersion(String16("2.4"));
|
||||
EXPECT_EQ(true, result);
|
||||
}
|
||||
|
||||
TEST(OpenCVEngineTest, GetPathForExistVersion)
|
||||
{
|
||||
sp<IOpenCVEngine> Engine = InitConnect();
|
||||
EXPECT_FALSE(NULL == Engine.get());
|
||||
String16 result = Engine->GetLibPathByVersion(String16("2.3"));
|
||||
EXPECT_STREQ("/data/data/org.opencv.lib_v23_armv7/lib",String8(result).string());
|
||||
}
|
||||
|
||||
TEST(OpenCVEngineTest, GetPathForUnExistVersion)
|
||||
{
|
||||
sp<IOpenCVEngine> Engine = InitConnect();
|
||||
EXPECT_FALSE(NULL == Engine.get());
|
||||
String16 result = Engine->GetLibPathByVersion(String16("2.5"));
|
||||
EXPECT_EQ(0, result.size());
|
||||
}
|
||||
|
||||
TEST(OpenCVEngineTest, InstallAndGetVersion)
|
||||
{
|
||||
sp<IOpenCVEngine> Engine = InitConnect();
|
||||
EXPECT_FALSE(NULL == Engine.get());
|
||||
EXPECT_TRUE(Engine->InstallVersion(String16("2.5")));
|
||||
String16 result = Engine->GetLibPathByVersion(String16("2.5"));
|
||||
EXPECT_STREQ("/data/data/org.opencv.lib_v25_tegra3/lib", String8(result).string());
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
#include "HardwareDetector.h"
|
||||
#include "IPackageManager.h"
|
||||
#include "IOpenCVEngine.h"
|
||||
#include "PackageInfo.h"
|
||||
#include <gtest/gtest.h>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
TEST(PackageInfo, FullNameArmv7)
|
||||
{
|
||||
PackageInfo info("230", PLATFORM_UNKNOWN, ARCH_ARMv7);
|
||||
string name = info.GetFullName();
|
||||
EXPECT_STREQ("org.opencv.lib_v23_armv7", name.c_str());
|
||||
}
|
||||
|
||||
TEST(PackageInfo, FullNameArmv7Neon)
|
||||
{
|
||||
PackageInfo info("230", PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_NEON);
|
||||
string name = info.GetFullName();
|
||||
EXPECT_STREQ("org.opencv.lib_v23_armv7", name.c_str());
|
||||
// TODO: Replace if seporate package will be exists
|
||||
//EXPECT_STREQ("org.opencv.lib_v23_armv7_neon", name.c_str());
|
||||
}
|
||||
|
||||
TEST(PackageInfo, FullNameArmv7VFPv3)
|
||||
{
|
||||
PackageInfo info("230", PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3);
|
||||
string name = info.GetFullName();
|
||||
EXPECT_STREQ("org.opencv.lib_v23_armv7", name.c_str());
|
||||
// TODO: Replace if seporate package will be exists
|
||||
//EXPECT_STREQ("org.opencv.lib_v23_armv7_vfpv3", name.c_str());
|
||||
}
|
||||
|
||||
TEST(PackageInfo, FullNameArmv7VFPv3Neon)
|
||||
{
|
||||
PackageInfo info("230", PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_NEON);
|
||||
string name = info.GetFullName();
|
||||
EXPECT_STREQ("org.opencv.lib_v23_armv7", name.c_str());
|
||||
// TODO: Replace if seporate package will be exists
|
||||
//EXPECT_STREQ("org.opencv.lib_v23_armv7_neon", name.c_str());
|
||||
}
|
||||
|
||||
TEST(PackageInfo, FullNameX86SSE2)
|
||||
{
|
||||
PackageInfo info("230", PLATFORM_UNKNOWN, ARCH_X86 | FEATURES_HAS_SSE2);
|
||||
string name = info.GetFullName();
|
||||
EXPECT_STREQ("org.opencv.lib_v23_x86", name.c_str());
|
||||
// TODO: Replace if seporate package will be exists
|
||||
//EXPECT_STREQ("org.opencv.lib_v23_x86_sse2", name.c_str());
|
||||
}
|
||||
|
||||
TEST(PackageInfo, Armv7VFPv3NeonFromFullName)
|
||||
{
|
||||
PackageInfo info("org.opencv.lib_v23_armv7_vfpv3_neon", "/data/data/org.opencv.lib_v23_armv7_vfpv3_neon");
|
||||
EXPECT_EQ("230", info.GetVersion());
|
||||
EXPECT_EQ(ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_NEON, info.GetCpuID());
|
||||
}
|
||||
|
||||
TEST(PackageInfo, X86SSE2FromFullName)
|
||||
{
|
||||
PackageInfo info("org.opencv.lib_v24_x86_sse2", "/data/data/org.opencv.lib_v24_x86_sse2");
|
||||
EXPECT_EQ(PLATFORM_UNKNOWN, info.GetPlatform());
|
||||
EXPECT_EQ(ARCH_X86 | FEATURES_HAS_SSE2, info.GetCpuID());
|
||||
EXPECT_EQ("240", info.GetVersion());
|
||||
}
|
||||
|
||||
TEST(PackageInfo, Tegra2FromFullName)
|
||||
{
|
||||
PackageInfo info("org.opencv.lib_v23_tegra2", "/data/data/org.opencv.lib_v23_tegra2");
|
||||
EXPECT_EQ("230", info.GetVersion());
|
||||
EXPECT_EQ(PLATFORM_TEGRA2, info.GetPlatform());
|
||||
}
|
||||
|
||||
TEST(PackageInfo, Tegra3FromFullName)
|
||||
{
|
||||
PackageInfo info("org.opencv.lib_v24_tegra3", "/data/data/org.opencv.lib_v24_tegra3");
|
||||
EXPECT_EQ("240", info.GetVersion());
|
||||
EXPECT_EQ(PLATFORM_TEGRA3, info.GetPlatform());
|
||||
}
|
||||
|
||||
TEST(PackageInfo, FullNameTegra3)
|
||||
{
|
||||
PackageInfo info("230", PLATFORM_TEGRA3, 0);
|
||||
EXPECT_TRUE(!info.IsValid());
|
||||
// TODO: Replace if seporate package will be exists
|
||||
//string name = info.GetFullName();
|
||||
//EXPECT_STREQ("org.opencv.lib_v23_tegra3", name.c_str());
|
||||
}
|
||||
|
||||
TEST(PackageInfo, FullNameTegra2)
|
||||
{
|
||||
PackageInfo info("230", PLATFORM_TEGRA2, 0);
|
||||
EXPECT_TRUE(!info.IsValid());
|
||||
// TODO: Replace if seporate package will be exists
|
||||
//string name = info.GetFullName();
|
||||
//EXPECT_STREQ("org.opencv.lib_v23_tegra2", name.c_str());
|
||||
}
|
||||
|
||||
TEST(PackageInfo, Comparator1)
|
||||
{
|
||||
PackageInfo info1("240", PLATFORM_UNKNOWN, ARCH_X86);
|
||||
PackageInfo info2("org.opencv.lib_v24_x86", "/data/data/org.opencv.lib_v24_x86");
|
||||
EXPECT_STREQ(info1.GetFullName().c_str(), info2.GetFullName().c_str());
|
||||
EXPECT_EQ(info1, info2);
|
||||
}
|
||||
|
||||
TEST(PackageInfo, Comparator2)
|
||||
{
|
||||
PackageInfo info1("240", PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_NEON | FEATURES_HAS_VFPv3);
|
||||
PackageInfo info2("org.opencv.lib_v24_armv7", "/data/data/org.opencv.lib_v24_armv7");
|
||||
// TODO: Replace if seporate package will be exists
|
||||
//PackageInfo info2("org.opencv.lib_v24_armv7_vfpv3_neon", "/data/data/org.opencv.lib_v24_armv7_vfpv3_neon");
|
||||
EXPECT_STREQ(info1.GetFullName().c_str(), info2.GetFullName().c_str());
|
||||
EXPECT_EQ(info1, info2);
|
||||
}
|
||||
|
||||
// TODO: Enable test if seporate package will be exists
|
||||
// TEST(PackageInfo, Comparator3)
|
||||
// {
|
||||
// PackageInfo info1("230", PLATFORM_TEGRA2, 0);
|
||||
// PackageInfo info2("org.opencv.lib_v23_tegra2", "/data/data/org.opencv.lib_v23_tegra2");
|
||||
// EXPECT_STREQ(info1.GetFullName().c_str(), info2.GetFullName().c_str());
|
||||
// EXPECT_EQ(info1, info2);
|
||||
// }
|
||||