我发布了我为解决问题的方法而创建的指南。可能有一些不相关的东西,但它们仍然有用。
主要问题是我禁用了自动建筑,而且方法的名称稍有不同。此外,发布的错误是由于我没有针对APP_PLATFORM 8而引起的,正如最后解释的。
基本出处:
的想法是,我们必须匹配并编译本地方法的Java声明。 首先,jni文件有一个默认文件夹。这个bug在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执行。在./应该是a之前,请注意在窗口中的“:”。相反(也是指南建议;在Linux中是错误的)。通过这种方式,您可以将头文件复制并直接用于源代码(以防移动功能或创建新代码)。
用手
你可以手工用这个命令还编译:
ndk-build -C jni
然而,由于生成文件丢失将无法正常工作。您应该添加一个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自动建设。