Android Gradle2.5实验版:包含.so库和来自JNI的调用
我的问题是,我没有找到一些正确的文档/指南,以便正确设置我的环境 基本上,我使用的是Android Studio 1.3.2(最新稳定版本为2015年9月22日),Gradle实验版为2.5 我在这里遵循了Google官方文档:但在JNI Libs方面,我没有找到任何帮助。我尝试了许多其他的解决方案,但都不起作用,因为它们似乎已经过时了 我有一个.so文件,其中包含一个简单的C++库,我创建该库是为了测试NDK的支持和集成,该库应该更好地支持Android Studio 1.3,正如Google I/O 2015年发布的那样 这就是我的非常简单的Android Gradle2.5实验版:包含.so库和来自JNI的调用,android,c++,android-studio,android-ndk,java-native-interface,Android,C++,Android Studio,Android Ndk,Java Native Interface,我的问题是,我没有找到一些正确的文档/指南,以便正确设置我的环境 基本上,我使用的是Android Studio 1.3.2(最新稳定版本为2015年9月22日),Gradle实验版为2.5 我在这里遵循了Google官方文档:但在JNI Libs方面,我没有找到任何帮助。我尝试了许多其他的解决方案,但都不起作用,因为它们似乎已经过时了 我有一个.so文件,其中包含一个简单的C++库,我创建该库是为了测试NDK的支持和集成,该库应该更好地支持Android Studio 1.3,正如Google
C++Lib
:
TestCPPClass.h的内容
#ifndef TESTCPPCLASS_H
#define TESTCPPCLASS_H
class TestCPPClass {
public:
double getDouble();
};
#endif TESTCPPCLASS_H
和TestClass.cpp:
#include "TestCPPClass.h"
double TestCPPClass::getDouble()
{
return 1; // cannot be dumber ! ^^
}
使用Cygwin-terminal和gcc我使用以下行编译了这个非常高级的库:
gcc.exe-shared-o TestLib.so TestCPPClass.cpp
它正确地生成了一个TestLib.so
在我当前的Android项目中,我有一个本机方法,该方法在JNI中实现如下:
publicstaticdouble-getDoubleFromJNI()代码>
使用javah.exe我生成了.h文件,然后实现了JNI方法,如下所示:
#include "jni.h"
#include "my_package_header.h"
#include "TestCPPClass.h" // => MARKED AS RED because not found ?
JNIEXPORT jdouble JNICALL Java_my_package_header_getDoubleFromJNI
(JNIEnv *env, jobject caller)
{
// Here I wish to call my TestLib.so that should contain my TestCPPClass and call "TestCPPClass::getDouble()"
// in order to return the result.
}
那我的build.gradle呢?
这是我为NDK提供的model{}
android.ndk {
moduleName = "MyAwesomeJNI"
ldLibs += "TestLib" => gradle SYNC works, but BUILD fails !
}
这是我得到的错误:
错误:任务的执行失败
“:app:linkArm64-v8aDebugMyAwesomeJNISharedLibrary”
生成操作失败。
链接libMyAwesomeJNI.so时链接器失败。请参阅完整日志,网址为:
file:///C:/Users/Me/Documents/MyProject/app/build/tmp/linkArm64-v8aDebugMyAwesomeJNISharedLibrary/output.txt
我使用New>目录在jni旁边手动创建了jniLibs文件夹。我还添加了一个armeabi文件夹,并将TestLib.so放入其中。我试过不用armeabi,但运气不好
我错过了什么?我完全迷路了!谢谢你的帮助 请查看以下指南:
我也很难处理.so文件,但我认为您缺少以下内容:
安卓{
// .. android settings ..
sourceSets.main {
jniLibs.srcDir 'src/main/myCppLibraries' // <-- Set your folder here!
}
应用程序结构:
app
-src
--main
---java
---jni
----test.c
---jniLibs
----libOpenCL.so
使用gradle Experiative:0.2.0谢谢,但这篇文章并不是gradle新语法的最新版本。下面,我尝试添加:但它失败了。对了,它似乎开始工作了,但我还没有。看看我的gradle文件(反正是它的一部分):现在看看我的CPP文件:当然,编译失败:错误:(6,26)testcppglass.h:没有这样的文件或目录
所以它仍然不起作用:/顺便说一句,我必须在我的gradle-wrapper.properties文件中使用distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-all.zip
如果你愿意,你可以使用一个预构建的库,但你也可以编译你的TestClass.cpp,这两个都是通过实验实现的al-plugin.@AlexCohn正如我的帖子所说,我已经尝试了使用编译的共享库(如您所说的预构建)的解决方案但问题在于编译时没有出现的链接,因此我的库根本没有被检测到,因此无法使用。我看不到你的build.gradle,但我相信问题恰恰在于这两种方法的混合。如果问题仍然存在,我可能会帮你找到解决方法。我相信我在交互式聊天窗口中,这样做会更容易。你的build.gradle是什么样子的?我们需要知道你是如何指定存储库的。。。
app
-src
--main
---java
---jni
----test.c
---jniLibs
----libOpenCL.so