Stanislav Parkhomenko Stanislav Parkhomenko - 4 months ago 30
Android Question

Undefined reference to function Android NDK

Im trying to build Android app with existing c++ code which use OpenCV.
But Android NDK says that " undefined reference to 'TestMath::getHello()' "

Here is my Android.mk :

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
#opencv
OPENCVROOT := /mypath/OpenCV-android-sdk
OPENCV_CAMERA_MODULES := off
OPENCV_INSTALL_MODULES := off
OPENCV_LIB_TYPE := SHARED
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk

LOCAL_MODULE := CrossMath
LOCAL_SRC_FILES := com_testapp_recognition_TestMath.cpp
LOCAL_SHARED_LIBRARIES := -lopencv_java3
include $(BUILD_SHARED_LIBRARY)


Application.mk :

APP_ABI := all
APP_CPPFLAGS := -frtti -fexceptions -std=c++11
APP_STL := gnustl_static
APP_PLATFORM := android-16


com_testapp_recognition_TestMath.hpp :

#include <jni.h>
#include "CrossMath/TestMath.hpp"
#ifndef _Included_com_testapp_recognition_TestMath
#define _Included_com_testapp_recognition_TestMath

#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jint JNICALL Java_com_testapp_recognition_TestMath_recognize(JNIEnv *, jobject, cv::Mat& originalImage);

#ifdef __cplusplus
}
#endif
#endif


com_testapp_recognition_TestMath.cpp:

#include "com_testapp_recognition_TestMath.hpp"
JNIEXPORT jint JNICALL Java_com_testapp_recognition_TestMath_recognize(JNIEnv *, jobject, cv::Mat& originalImage) {
return TestMath::getHello().size();
}


And finally TestMath.cpp which located in subfolder CrossMath:

#include "TestMath.hpp"

namespace TestMath {
string getHello() {
return "Hello";
}
}


TestMath.hpp :

#ifndef TestMath_hpp
#define TestMath_hpp

#include <stdio.h>
#include <iostream>
#include "opencv2/core/core_c.h"
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

namespace TestMath {
string getHello();
}


Java classes and other staff defined, I checked path and includes in files.

Error:

Error:(13) undefined reference to `TestMath::getHello()'

Answer

You are missing CrossMath/TestMath.cpp in your LOCAL_SRC_FILES.

In addition to that, if the string you refer to in your code is supposed to be std::string you need to include <string> in TestMath.hpp and change the type to std::string.