在Android Studio中使用预构建的库和jni

Sie*_*rra 5 java-native-interface android shared-libraries android-ndk

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

MyProject
---| MyAndroidApp
---| MyAndroidLibrary
    ---| jni
    ---| jniLibs
Run Code Online (Sandbox Code Playgroud)

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

productFlavors {
    x86 {
        flavorDimension "abi"
        ndk {
            abiFilter "x86"
        }
    }
    arm {
        flavorDimension "abi"
        ndk {
            abiFilter "armeabi-v7a"
        }
    }
    mips {
        flavorDimension "abi"
        ndk {
            abiFilter "mips"
        }
    }
    fat {
        flavorDimension "abi"
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试从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)
Run Code Online (Sandbox Code Playgroud)

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

#include "MyDLL.h"

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

谢谢您的回答.

Dmi*_*huk 1

目前 gradle 插件不支持此类 NDK 配置。它忽略现有的 Android.mk 并动态生成自己的 Android.mk(非常有限)。您可以在此处查看它是如何生成的(查看writeMakefile方法)并自行评估影响其生成的选项集的有限程度。

实际上,要实现您所需要的,最好的方法是完全禁用 gradle 限制的 NDK 支持并显式调用 ndk-build。阅读此处了解详细信息。