我正在使用Android Studio 1.0.2,试图创建一个使用NDK和本地函数的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中定义了以下Flavors: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不是很熟悉,所以我不确定它实际上构建了什么。
我正在寻找的是使用gradle的Android.mk的严格等效版本:
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);
}
感谢你的回答。