NDK& Android Studio,由于共享库而编译崩溃

时间:2015-05-29 08:54:42

标签: android c++ android-ndk

对于代码重用,我必须将一些本机代码从工作目录移动到共享库。然而,这种运动会带来很多麻烦。

如果我尝试在旧的地方编译它,一切都只是点击,而是如果我尝试用相同的数据将它编译到共享库中...它失败了。不知道为什么。

另外我甚至无法使用Android Studio自动执行此功能,因为Android Studio出于某种奇怪的原因并不能识别ndk构建命令。

.mk文件是这样的:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := exam_filter
LOCAL_SRC_FILES := exam_filter.cpp
LOCAL_LDLIBS    := -lm -llog -ljnigraphics

include $(BUILD_SHARED_LIBRARY)

当我尝试在新的foulder中编译它时我得到的错误是:

ndk-build -C jni/
make: Entering directory `/home/fil/.../jni'
[armeabi] Compile++ thumb: exam_filter <= exam_filter.cpp
/home/fil/.../jni/exam_filter.cpp:4:28: fatal error: android/bitmap.h: No such file or directory
 #include <android/bitmap.h>
                            ^
compilation terminated.

有什么想法吗?谢谢:))

1 个答案:

答案 0 :(得分:1)

我发布了我为了解决问题的方法而创建的指南。可能有一些不相关的东西,但它们仍然有用。

主要问题是我已经禁用了自动构建,并且方法的名称略有不同。此外,发布的错误是由于我没有针对APP_PLATFORM 8这一事实引起的,正如最后所解释的那样。

基本参考资料:

我们的想法是我们必须将本机方法匹配并编译为java声明。 首先,jni文件有一个默认的foulder。这个foulder在src / main / jniLibs中。如果你想以这种方式改变它:

sourceSets.main {
    jniLibs.srcDir 'src/main/libs'
}

小心不要使用jni.srcDirs = []否则默认的jni编译将被禁用,你必须手动使用任务和其他复杂的东西(现在不需要)。 还有两个.mk文件......因为我们已经定义了它们,它们将被忽略:

ndk {
    moduleName "exam_filter"
    ldLibs "log", "jnigraphics"
}

在gradle文件中,这是gradle的相应版本。每个新的更改都必须在这里完成,而不是使用makefile。 为了使它工作,每个本机函数应该匹配java中声明的每个函数。为此,最好从java自动创建头文件。这对于以这种方式使用javah非常有用:

javah -classpath "/home/[...]/Android/Sdk/platforms/android-22/android.jar:./" -jni com.package.[...].NameOfTheClass

这应该从src / main执行。小心,在./之前的“:”应该是一个;相反(也是指南建议;在linux中是错误的)。通过这种方式,您将获得要复制的标题,并直接在源代码上使用(如果您移动函数或创建新函数)。

手动

您也可以使用此命令手动编译:

ndk-build -C jni

但是由于缺少makefile,因此无法正常工作。你应该像这样添加一个Android.mk文件:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := exam_filter
LOCAL_SRC_FILES := exam_filter.cpp
LOCAL_LDLIBS := -lm -llog -ljnigraphics
include $(BUILD_SHARED_LIBRARY)

这样的Application.mk文件:

APP_PLATFORM=android-8

但是,如果您使用的是Android Studio自动构建,现在不需要手动执行此操作。