【问题标题】:Using pre-built libraries and jni in Android Studio在 Android Studio 中使用预构建的库和 jni
【发布时间】:2015-03-30 05:11:44
【问题描述】:

我正在使用 android studio 1.0.2,我正在尝试创建一个使用 ndk 和 natives 函数的 android 库。这基本上是我项目的架构:

MyProject
---| MyAndroidApp
---| MyAndroidLibrary
    ---| jni
    ---| jniLibs

在我的 android 库中,我有一个从共享库调用函数的单个 c++ 包装器。我用ndk-build 创建了这个库(它与eclipse 完美配合)。我在 jniLibs 文件夹/架构中添加了这个库(arm64-v8a、armeabi、armeabi-v7a、mips、mips64、x86 和 x86_64)。 我在 MyAndroidLibrary/build.gradle 中定义了以下 Flavor:

productFlavors {
    x86 {
        flavorDimension "abi"
        ndk {
            abiFilter "x86"
        }
    }
    arm {
        flavorDimension "abi"
        ndk {
            abiFilter "armeabi-v7a"
        }
    }
    mips {
        flavorDimension "abi"
        ndk {
            abiFilter "mips"
        }
    }
    fat {
        flavorDimension "abi"
    }
}

但是,当我尝试从 jni 代码调用我的库函数时,我得到一个未定义的引用错误。换句话说,我的共享库似乎没有加载到 jni 端。但是,当我删除这些函数的调用并探索在输出中创建的 .aar 时,我可以检索库 .so。

我对 gradle 的东西不是很熟悉,所以我不确定它真正构建的是什么。

我正在寻找的是一个严格等价的 Android.mk,使用 gradle:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE            := mysharedlib
LOCAL_SRC_FILES         := ../shared/mysharedlib.so
LOCAL_EXPORT_C_INCLUDES := ../shared/includes/mysharedlib.h

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE            := jni
LOCAL_SRC_FILES         := jni.cpp
LOCAL_C_INCLUDES        += ../shared/includes/mysharedlib.h
LOCAL_LDLIBS            := -llog
LOCAL_SHARED_LIBRARIES  := mysharedlib

include $(BUILD_SHARED_LIBRARY)

我想在我的 jni 代码上调用预构建库中的函数,例如:

#include "MyDLL.h"

JNIEXPORT jint JNICALL Java_com_iskn_dbapi_DBAPI_getNegative(JNIEnv *env, jclass obj, jint integer)
{
   return MyDLL::getNegative(integer);
}

感谢您的回答。

【问题讨论】:

  • 你最终解决了这个问题吗?

标签: android android-ndk java-native-interface shared-libraries


【解决方案1】:

目前 gradle 插件不支持这样的 NDK 配置。它忽略现有的 Android.mk 并即时生成自己的(非常有限)。您可以查看here 的生成方式(查看writeMakefile 方法)并自行评估选项集的限制程度,从而影响其生成。

实际上,要实现您的需要,最好的方法是完全禁用 gradle 有限的 NDK 支持并显式调用 ndk-build。阅读here了解详情。

【讨论】:

  • 感谢您的回答。好吧,实际上,我需要 gradle 来创建一个 .aar。但是 jniLibs 文件夹不应该预先构建它包含的库​​吗?根据这个link,请参阅预建库部分。
  • 对不起,我不明白你的要求。你能改写你的问题吗?顺便说一句,在上面的链接中,您可以看到 sourceSets.main.jniLibs.srcDir 'src/main/libs' 行 - 这意味着该文件夹将用于将本机库打包到 APK 中,而不是“jniLibs”。
  • 当然。我需要的是一个包含我的共享库的 .aar(android 存档)。为此,我必须使用 gradle,不是吗?另一件事是我在上面发布的链接上看到 jniLibs 文件夹中的所有库都应该自动预构建,对吗?
  • 你找到解决这个问题的方法了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多