Android Gradle2.5实验版:包含.so库和来自JNI的调用

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

我的问题是,我没有找到一些正确的文档/指南,以便正确设置我的环境

基本上,我使用的是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年发布的那样

这就是我的非常简单的
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-terminalgcc我使用以下行编译了这个非常高级的库:

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