Android Native Camera: dlopen errors
I'm using OpenCV 2.4.9's Android native camera library in a third-party project, and am hitting some inconsistent behaviour. On a Samsung Galaxy S2 running Android 2.3.3, the native libraries load fine and I get frames back from CameraActivity. However, on other devices, I don't even get past the dlopen.
The OpenCV libraries are statically linked, and the libnative_camera_r*.so files are correctly placed into the .apk, and correctly installed on the device (verified with adb shell ls).
Relevant logcat output from a failed launch on a Samsung Galaxy Tab 2.0 running Android 4.2.2 is below.
The dlopen failure is not failure to open the .so file, but rather to link the required symbol (demanged to android::Camera::setPreviewDisplay(android::sp<android::isurface> const&) )
Is there something obvious that I'm failing to link during my native build?
D/OpenCV::camera: Library name: libcameraNative.so
D/OpenCV::camera: Library base address: 0x592cf000
D/OpenCV::camera: Libraries folder found: /data/app-lib/com.mycompany.cameraNativeTest/
D/OpenCV::camera: CameraWrapperConnector::connectToLib: folderPath=/data/app-lib/com.mycompany.cameraNativeTest/
E/OpenCV::camera: ||libnative_camera_r2.3.3.so
E/OpenCV::camera: ||libnative_camera_r4.2.0.so
E/OpenCV::camera: ||libnative_camera_r4.3.0.so
E/OpenCV::camera: ||libnative_camera_r4.4.0.so
E/OpenCV::camera: ||libnative_camera_r4.1.1.so
E/OpenCV::camera: ||libnative_camera_r2.2.0.so
E/OpenCV::camera: ||libnative_camera_r3.0.1.so
E/OpenCV::camera: ||libnative_camera_r4.0.0.so
E/OpenCV::camera: ||libnative_camera_r4.0.3.so
D/OpenCV::camera: try to load library 'libnative_camera_r4.4.0.so'
D/OpenCV::camera: CameraWrapperConnector::connectToLib ERROR: cannot dlopen camera wrapper library /data/app-lib/com.mycompany.cameraNativeTest/libnative_camera_r4.4.0.so, dlerror="Cannot load library: soinfo_relocate(linker.cpp:976): cannot locate symbol "_ZN7android6Camera17setPreviewDisplayERKNS_2spINS_8ISurfaceEEE" referenced by "libnative_camera_r4.4.0.so"..."
D/OpenCV::camera: try to load library 'libnative_camera_r4.3.0.so'
D/OpenCV::camera: CameraWrapperConnector::connectToLib ERROR: cannot dlopen camera wrapper library /data/app-lib/com.mycompany.cameraNativeTest/libnative_camera_r4.3.0.so, dlerror="Cannot load library: soinfo_relocate(linker.cpp:976): cannot locate symbol "_ZN7android6Camera17setPreviewDisplayERKNS_2spINS_8ISurfaceEEE" referenced by "libnative_camera_r4.3.0.so"..."
D/OpenCV::camera: try to load library 'libnative_camera_r4.2.0.so'
D/OpenCV::camera: CameraWrapperConnector::connectToLib ERROR: cannot dlopen camera wrapper library /data/app-lib/com.mycompany.cameraNativeTest/libnative_camera_r4.2.0.so, dlerror="Cannot load library: soinfo_relocate(linker.cpp:976): cannot locate symbol "_ZN7android6Camera17setPreviewDisplayERKNS_2spINS_8ISurfaceEEE" referenced by "libnative_camera_r4.2.0.so"..."
D/OpenCV::camera: try to load library 'libnative_camera_r4.1.1.so'
D/OpenCV::camera: CameraWrapperConnector::connectToLib ERROR: cannot dlopen camera wrapper library /data/app-lib/com.mycompany.cameraNativeTest/libnative_camera_r4.1.1.so, dlerror="Cannot load library: soinfo_relocate(linker.cpp:976): cannot locate symbol "_ZN7android6Camera17setPreviewDisplayERKNS_2spINS_8ISurfaceEEE" referenced by "libnative_camera_r4.1.1.so"..."
D/OpenCV::camera: try to load library 'libnative_camera_r4.0.3.so'
D/OpenCV::camera: CameraWrapperConnector::connectToLib ERROR: cannot dlopen camera wrapper library /data/app-lib/com.mycompany.cameraNativeTest/libnative_camera_r4.0.3.so, dlerror="Cannot load library: soinfo_relocate(linker.cpp:976): cannot locate symbol "_ZN7android6Camera17setPreviewDisplayERKNS_2spINS_8ISurfaceEEE" referenced by "libnative_camera_r4.0.3.so"..."
D/OpenCV::camera: try to load library 'libnative_camera_r4.0 ...
I'm having a similar issue with a 4.4.x device where deploying the apk with
libnative_camera_r4.3.0.so
andlibnative_camera_r4.4.0.so
causes adlopen failed: cannot locate symbol "_ZN7android11BufferQueueC1EbRKNS_2spINS_19IGraphicBufferAllocEEE"
error. Deploying withlibnative_camera_r4.4.0.so
only solves the problem. I'm guessing that when alibnative_camera_r*.so
lib is loaded, it is not differentiated with respect to the current Android version, probably due to trusting OpenCV Manager keeping only the correct version around. I'm not going to use OpenCV manager anytime soon, so this is a bit tedious having to deploy multiple apks for multiple Android versions.