我正在从Eclipse迁移到Android Studio,我正在尝试使用Gradle来包含PreBuilt静态库。 我正在关注随ndk示例项目提供的两个libs示例,并在Android Studio中实现它。
我有什么:
预构建的静态库:
[ndk-path] \ samples \ two-libs \ _ obj \ local \ armeabi-v7a \ libtwolib-first.a
库的头文件:
[NDK路径] \样品\两库\ JNI \ first.h
包含一个方法:
extern int first(int x, int y);
现在如何在android studio中将它用作预构建的静态库?
我尝试了什么:
添加文件 通过创建jniLibs将库添加到我的android studio项目中(我读过这个用于preBuild动态库,不确定preDuilt静态库是否也应该使用此路径):
[机器人工作室项目路径] \应用\ SRC \主\ jniLibs \ armeabi-V7A \ libtwolib-first.a
并将头文件添加到:
[机器人工作室项目路径] \应用\ SRC \主\ JNI \ first.h
代码更改:
在java中: 称为本地方法Foo。
在JNI头文件中: 宣布了Foo方法。
在实现JNI标头的c文件中: 添加了#include" first.h" 并称之为第一种方法。
但是我在编译期间遇到错误:
"错误:未定义引用'首先'"
我猜这是因为在编译期间它没有找到first.h的实现文件,也不能动态加载它。 如果我添加first.c文件(实现文件,而不是将其作为库加载)
我是c代码和JNI的新手,所以任何帮助都会很好!
答案 0 :(得分:1)
我正在努力解决同样的问题并尝试各种各样的技巧,浪费了相当多的时间,直到我碰到这个:https://groups.google.com/d/msg/adt-dev/FoyeXl2vl3s/jLvH5lztDwAJ并找到了解决方案。
在build.gradle
文件中,将预构建的库作为ldLibs
部分中android.ndk
的一部分,例如。
android.ndk {
moduleName = "myJniModule"
stl = "gnustl_shared" // Or whichever you like
// Put your cppFlags or CFlags here too
ldLibs += ['twolib-first'] // The name of your prebuilt lib without file suffix and 'lib' prefix
}
然后在productFlavors
中添加ldFlags
中预建lib的路径:
android.productFlavors {
create("arm") {
ndk.with {
abiFilters += "armeabi-v7a"
ndk.ldFlags += "-L${file("app/src/main/jniLibs/armeabi-v7a/")}".toString()
}
}
}
这至少对我有用。我使用的是实验性的Gradle插件v0.2.0。