对于代码重用,我必须将一些本机代码从工作目录移动到共享库。然而,这种运动会带来很多麻烦。
如果我尝试在旧的地方编译它,一切都只是点击,而是如果我尝试用相同的数据将它编译到共享库中...它失败了。不知道为什么。
另外我甚至无法使用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.
有什么想法吗?谢谢:))
答案 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自动构建,现在不需要手动执行此操作。