ndk-build undefined reference errror

时间:2018-05-03 12:30:19

标签: android android-ndk ogr

我使用ndk-build为我的android项目构建一组共享库(.so)。我配置并制作了C ++库的源代码(gdal-2.2.2)。 一切都很好。(" ./ configure& make& make install"成功)。

所以我创建了我的jni文件夹,如documentation

但是当我试图在Windows上使用ndk-build时,我会收到很多错误,例如"未定义的对某事物的反思"。

我花了很多时间在这个项目上。有人帮我吗? 感谢。

更新

我在ubuntu 16.04上使用了这样的配置:

./configure --prefix=/home/mahdi/Desktop/build/ --with-spatialite=yes --with-spatialite-soname=libspatialite.so --host=i686-linux-android  CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0" LIBS="-lsupc++ -lstdc++"

make& make install step 我创建了JNI。这是我的目录。

jniwrap
jni
  gdal
  Android.mk
  Application.mk
  gdal_wrap.cpp
  gdalconst_wrap.c  
  gnm_wrap.cpp  
  libgdal.a 
  ogr_wrap.cpp
  osr_wrap.cpp

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := gdal
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/gdal/include
LOCAL_SRC_FILES := libgdal.a
LOCAL_EXPORT_LDLIBS := -lz
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := gdaljni
LOCAL_SRC_FILES := gdal_wrap.cpp
LOCAL_STATIC_LIBRARIES := gdal
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := gdalconstjni
LOCAL_SRC_FILES := gdalconst_wrap.c
LOCAL_STATIC_LIBRARIES := gdal
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := ogrjni
LOCAL_SRC_FILES := ogr_wrap.cpp
LOCAL_STATIC_LIBRARIES := gdal
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := osrjni
LOCAL_SRC_FILES := osr_wrap.cpp
LOCAL_STATIC_LIBRARIES := gdal
include $(BUILD_SHARED_LIBRARY)

Aplication.mk

APP_STL := gnustl_shared
APP_CFLAGS := Android.mk
APP_ABI := x86
APP_PLATFORM := android-14

然后我在windows-x86_64中使用了android-ndk-r16b,但我遇到了这些错误,如下图所示:

undefined reference ...

有很多"未定义的引用错误"我无法在这里展示。

注意:为了制作gdal Java Binding,我在ubuntu 16.04上使用了swig和jdk7。

1 个答案:

答案 0 :(得分:1)

在ubuntu计算机上构建 libgdal.a 时,必须使用sqlite3,它会解析#include "sqlite3.h"

这些包含文件足以用于静态库,但要创建 libgdaljni.so ,您还需要 libsqlite3.a 。你可以在同一个ubuntu机器上自己交叉编译它,但是获得预建的库可能是好的,例如来自https://github.com/couchbase/couchbase-lite-java-native/tree/master/vendor/sqlite/libs/android

将此文件(适用于相应的ABI)复制到同一目录,然后相应地修改 Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := sqlite3
LOCAL_SRC_FILES := libsqlite3.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := gdal
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/gdal/include
LOCAL_SRC_FILES := libgdal.a
LOCAL_EXPORT_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := sqlite3
include $(PREBUILT_STATIC_LIBRARY)

*continued without changes*

如果您仍然有"未定义的引用错误",这可能意味着应该添加其他一些库。