如何在Android Studio和NDK上使用额外的*.so库
我正在尝试生成一个Android应用程序来使用一些额外的*.so库(特别是“libinterface.so”)。这些库是在外部生成的,并作为依赖项包含在从Java端调用的包装类中。该库存储在“src/main/jniLibs/armeabi-v7a”中。系统将所有.so文件包含到生成的应用程序中 以前,我使用Eclipse来实现这个目的,并且我能够使用这个库,但是我在使用Android Studio时遇到了一些问题 生成的错误是:如何在Android Studio和NDK上使用额外的*.so库,android,android-studio,java-native-interface,shared-libraries,gradle-experimental,Android,Android Studio,Java Native Interface,Shared Libraries,Gradle Experimental,我正在尝试生成一个Android应用程序来使用一些额外的*.so库(特别是“libinterface.so”)。这些库是在外部生成的,并作为依赖项包含在从Java端调用的包装类中。该库存储在“src/main/jniLibs/armeabi-v7a”中。系统将所有.so文件包含到生成的应用程序中 以前,我使用Eclipse来实现这个目的,并且我能够使用这个库,但是我在使用Android Studio时遇到了一些问题 生成的错误是: /home/******/Libraries/android-s
/home/******/Libraries/android-sdk-linux/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9/../../../../aarch64-linux-android/bin/ld: cannot find -linterface
由于链接器抛出错误,因此它看起来与库包含步骤相关。在Eclipse上,我使用了一个“Android.mk”文件来包含新的库,但我找不到使用Gradle实现这一点的方法
#Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libinterface-prebuilt
LOCAL_SRC_FILES := prebuilt/libinterface.so
include $(PREBUILT_SHARED_LIBRARY)
我试图将库包含在此gradle定义中(注意:我已经包含了最后的JNI支持和gradle实验):
但不起作用:
Error: org.gradle.nativeplatform.toolchain.internal.CommandLineToolInvocationFailure: Linker failed while linking libcustom_wrapper_jni.so.
好的,可能有两个不同的问题 首先,您必须确保为正确的体系结构编译库。如果您使用的是armeabi-v7a库,但编译器试图加载armeabi库,则编译将失败 第二,也是第一个问题之后,您必须根据所使用的体系结构包括库。 在模块build.gradle脚本中使用“”配置 在示例中,您可以尝试执行以下操作:
// custom_wrapper_jni.h
#ifndef ANDROID_JNI_H
#define ANDROID_JNI_H
#include <jni.h>
extern "C"
{
JNIEXPORT jint JNICALL
Java_com_example_goe_android_JniInterface_testFunction(JNIEnv *env,
jobject instance);
}
#endif
#ifndef INTERFACE_H__
#define INTERFACE_H__
#include <string>
class Interface
{
public:
static Interface* create();
virtual ~Interface(){}
// Testing function
virtual int test() = 0;
protected:
Interface();
};
#endif // INTERFACE_H__
android.productFlavors {
create("arm") {
ndk.with{
abiFilters.add("armeabi")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi/"
ldLibs.add(libsDir + "libinterface.so")
}
}
create("armv7") {
ndk.with {
abiFilters.add("armeabi-v7a")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi-v7a/"
ldLibs.add(libsDir + "libinterface.so")
}
}
}
此外,我建议您使用“jniLibs”来存储库,因为它是它们的默认路径,但对每个拱门使用不同的文件夹
您可以查看其他示例,如
希望这有帮助。您好。您将libinterface.so放在哪里?库存储在'src/main/jniLibs/armeabi-v7a'中。因为它可能是重要的信息,我已经更新了这个问题。其他的。所以库可以正确加载吗?我只使用这个库进行测试。我还可以使用其他库进行测试。有什么建议吗?也许你可以试试其他库是否合适。如何用这种方法编译fat库?
def lib_path = file("src/main/jniLibs").absolutePath
model {
repositories {
libs(PrebuiltLibraries) {
newlibs {
headers.srcDir file("../Integration/include").absolutePath
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("${lib_path}/${targetPlatform.getName()}/libinterface.so")
println "Included libraries: " + file("${lib_path}/${targetPlatform.getName()}/libinterface.so")
}
}
}
}
android {
...
}
android.sources {
main {
jni {
dependencies {
library "newlibs" linkage "shared"
}
}
}
}
}
Error: org.gradle.nativeplatform.toolchain.internal.CommandLineToolInvocationFailure: Linker failed while linking libcustom_wrapper_jni.so.
android.productFlavors {
create("arm") {
ndk.with{
abiFilters.add("armeabi")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi/"
ldLibs.add(libsDir + "libinterface.so")
}
}
create("armv7") {
ndk.with {
abiFilters.add("armeabi-v7a")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi-v7a/"
ldLibs.add(libsDir + "libinterface.so")
}
}
}