Hi,
I am a complete beginner to this so my problem is quite basic. I have the task to include ceres library in a android c++ project and then run the helloworld code through jni.
Any help or guidance would be highly appreciated!
I have tried the following:
a) compiling the ceres library through
cmake in linux and then include the library "libceres.so" in jniLibs and including the helloworld code in native-lib.cpp and calling it from main activity. I checked in terminal and it works fine but not in android. The project syncs fine but when i build, it gives the following error:
Build command failed.
Error while executing process /home/rauf/Android/Sdk/cmake/3.6.4111459/bin/cmake with arguments {--build /home/rauf/AndroidStudioProjects/ceres4/app/.externalNativeBuild/cmake/debug/arm64-v8a --target native-lib}
[1/1] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so
FAILED: : && /home/rauf/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=aarch64-none-linux-android --gcc-toolchain=/home/rauf/Android/Sdk/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64 --sysroot=/home/rauf/Android/Sdk/ndk-bundle/sysroot -fPIC -isystem /home/rauf/Android/Sdk/ndk-bundle/sysroot/usr/include/aarch64-linux-android -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -std=c++11 -frtti -fexceptions -O0 -fno-limit-debug-info -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -nostdlib++ --sysroot /home/rauf/Android/Sdk/ndk-bundle/platforms/android-21/arch-arm64 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -L/home/rauf/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/arm64-v8a -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib.so -o ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o /home/rauf/Android/Sdk/ndk-bundle/platforms/android-21/arch-arm64/usr/lib/liblog.so ../../../../src/main/jniLibs/libceres.so -latomic -lm "/home/rauf/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_static.a" "/home/rauf/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++abi.a" && :
../../../../src/main/jniLibs/libceres.so: error adding symbols: File in wrong format
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.b) if I use ndk-build to make the library with options CERES_NO_THREADS and make a static library and include in the similar way then this error shows :
Build command failed.
Error while executing process /home/rauf/Android/Sdk/cmake/3.6.4111459/bin/cmake with arguments {--build /home/rauf/AndroidStudioProjects/ceres3/app/.externalNativeBuild/cmake/debug/arm64-v8a --target native-lib}
[1/1] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so
FAILED: : && /home/rauf/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=aarch64-none-linux-android --gcc-toolchain=/home/rauf/Android/Sdk/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64 --sysroot=/home/rauf/Android/Sdk/ndk-bundle/sysroot -fPIC -isystem /home/rauf/Android/Sdk/ndk-bundle/sysroot/usr/include/aarch64-linux-android -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -std=c++11 -frtti -fexceptions -O0 -fno-limit-debug-info -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -nostdlib++ --sysroot /home/rauf/Android/Sdk/ndk-bundle/platforms/android-21/arch-arm64 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -L/home/rauf/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/arm64-v8a -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib.so -o ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o /home/rauf/Android/Sdk/ndk-bundle/platforms/android-21/arch-arm64/usr/lib/liblog.so ../../../../src/main/jniLibs/arm64-v8a/libceres.a -latomic -lm "/home/rauf/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_static.a" "/home/rauf/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++abi.a" && :
CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o: In function `Java_com_example_rauf_ceres4_MainActivity_stringFromJNI':
/home/rauf/AndroidStudioProjects/ceres3/app/src/main/cpp/native-lib.cpp:26: undefined reference to `google::InitGoogleLogging(char const*)'
CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o: In function `AutoDiffCostFunction':
/home/rauf/AndroidStudioProjects/include/ceres/autodiff_cost_function.h:174: undefined reference to `google::LogMessageFatal::LogMessageFatal(char const*, int, google::CheckOpString const&)'
/home/rauf/AndroidStudioProjects/include/ceres/autodiff_cost_function.h:174: undefined reference to `google::LogMessage::stream()'
/home/rauf/AndroidStudioProjects/include/ceres/autodiff_cost_function.h:174: undefined reference to `google::LogMessageFatal::~LogMessageFatal()'
/home/rauf/AndroidStudioProjects/include/ceres/autodiff_cost_function.h:174: undefined reference to `google::LogMessageFatal::~LogMessageFatal()'
CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o: In function `std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >* google::MakeCheckOpString<int, ceres::DimensionType>(int const&, ceres::DimensionType const&, char const*)':
/home/rauf/AndroidStudioProjects/include/glog/logging.h:669: undefined reference to `google::base::CheckOpMessageBuilder::CheckOpMessageBuilder(char const*)'
/home/rauf/AndroidStudioProjects/include/glog/logging.h:671: undefined reference to `google::base::CheckOpMessageBuilder::ForVar2()'
/home/rauf/AndroidStudioProjects/include/glog/logging.h:672: undefined reference to `google::base::CheckOpMessageBuilder::NewString()'
/home/rauf/AndroidStudioProjects/include/glog/logging.h:673: undefined reference to `google::base::CheckOpMessageBuilder::~CheckOpMessageBuilder()'
/home/rauf/AndroidStudioProjects/include/glog/logging.h:673: undefined reference to `google::base::CheckOpMessageBuilder::~CheckOpMessageBuilder()'
CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o: In function `ceres::internal::AutoDiff<CostFunctor, double, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0>::Differentiate(CostFunctor const&, double const* const*, int, double*, double**)':
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:215: undefined reference to `google::LogMessageFatal::LogMessageFatal(char const*, int, google::CheckOpString const&)'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:215: undefined reference to `google::LogMessage::stream()'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:215: undefined reference to `google::LogMessageFatal::~LogMessageFatal()'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:215: undefined reference to `google::LogMessageFatal::~LogMessageFatal()'
CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o: In function `void ceres::internal::Make1stOrderPerturbation<ceres::Jet<double, 1>, double, 1>(int, double const*, ceres::Jet<double, 1>*)':
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:170: undefined reference to `google::LogMessageFatal::LogMessageFatal(char const*, int)'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:170: undefined reference to `google::LogMessage::stream()'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:170: undefined reference to `google::LogMessageFatal::~LogMessageFatal()'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:171: undefined reference to `google::LogMessageFatal::LogMessageFatal(char const*, int)'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:171: undefined reference to `google::LogMessage::stream()'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:171: undefined reference to `google::LogMessageFatal::~LogMessageFatal()'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:170: undefined reference to `google::LogMessageFatal::~LogMessageFatal()'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:171: undefined reference to `google::LogMessageFatal::~LogMessageFatal()'
CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o: In function `void ceres::internal::Take0thOrderPart<ceres::Jet<double, 1>, double*>(int, ceres::Jet<double, 1> const*, double*)':
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:183: undefined reference to `google::LogMessageFatal::LogMessageFatal(char const*, int)'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:183: undefined reference to `google::LogMessage::stream()'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:183: undefined reference to `google::LogMessageFatal::~LogMessageFatal()'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:183: undefined reference to `google::LogMessageFatal::~LogMessageFatal()'
CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o: In function `void ceres::internal::Take1stOrderPart<ceres::Jet<double, 1>, double, 0, 1>(int, ceres::Jet<double, 1> const*, double*)':
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:193: undefined reference to `google::LogMessageFatal::LogMessageFatal(char const*, int)'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:193: undefined reference to `google::LogMessage::stream()'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:193: undefined reference to `google::LogMessageFatal::~LogMessageFatal()'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:194: undefined reference to `google::LogMessageFatal::LogMessageFatal(char const*, int)'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:194: undefined reference to `google::LogMessage::stream()'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:194: undefined reference to `google::LogMessageFatal::~LogMessageFatal()'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:193: undefined reference to `google::LogMessageFatal::~LogMessageFatal()'
/home/rauf/AndroidStudioProjects/include/ceres/internal/autodiff.h:194: undefined reference to `google::LogMessageFatal::~LogMessageFatal()'
CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o: In function `std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >* google::MakeCheckOpString<int, int>(int const&, int const&, char const*)':
/home/rauf/AndroidStudioProjects/include/glog/logging.h:669: undefined reference to `google::base::CheckOpMessageBuilder::CheckOpMessageBuilder(char const*)'
/home/rauf/AndroidStudioProjects/include/glog/logging.h:671: undefined reference to `google::base::CheckOpMessageBuilder::ForVar2()'
/home/rauf/AndroidStudioProjects/include/glog/logging.h:672: undefined reference to `google::base::CheckOpMessageBuilder::NewString()'
/home/rauf/AndroidStudioProjects/include/glog/logging.h:673: undefined reference to `google::base::CheckOpMessageBuilder::~CheckOpMessageBuilder()'
/home/rauf/AndroidStudioProjects/include/glog/logging.h:673: undefined reference to `google::base::CheckOpMessageBuilder::~CheckOpMessageBuilder()'
../../../../src/main/jniLibs/arm64-v8a/libceres.a(problem_impl.o): In function `ceres::internal::ProblemImpl::InternalAddParameterBlock(double*, int)':
/home/rauf/Android/ceres-solver-1.14.0/jni/../internal/ceres/problem_impl.cc:135: undefined reference to `google::LogMessageFatal::LogMessageFatal(char const*, int)'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
My CMAKELISTS.TXT looks like this:
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
# Sets the minimum version of CMake required to build the native library.
set(pathToProject ~/AndroidStudioProjects/ceres3)
cmake_minimum_required(VERSION 3.4.1)
include_directories(~/AndroidStudioProjects/include/
~/AndroidStudioProjects/include/eigen3)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp )
add_library (ceres-lib STATIC IMPORTED)
set_target_properties(ceres-lib PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libceres.a)
find_library( # Sets the name of the path variable.
log-lib
log )
target_link_libraries( # Specifies the target library.
native-lib
${log-lib}
ceres-lib)