【问题标题】:Gradle 2.5 Experimental : include .so library and call from JNIGradle 2.5 Experimental:包括 .so 库和来自 JNI 的调用
【发布时间】:2015-09-22 13:13:31
【问题描述】:

我的问题是我找不到一些合适的文档/指南来正确设置我的环境。

基本上我使用的是 Android Studio 1.3.2(截至 2015 年 9 月 22 日的最新稳定版本)和 Gradle Experimental 版本 2.5。

我在这里关注了 Google 官方文档:http://tools.android.com/tech-docs/new-build-system/gradle-experimental,但在 JNI Libs 方面我找不到任何帮助。我尝试了许多其他解决方案,但它们都不起作用,因为它们似乎已经过时了。

我有一个 .so 文件,其中包含一个简单的 C++ 库,用于测试 NDK 支持和集成,在 Google 期间宣布的 Android Studio 1.3 应该会更好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 终端gcc 我使用以下行编译了这个非常高级的库:

gcc.exe -shared -o TestLib.so TestCPPClass.cpp

确实正确生成了TestLib.so

在我当前的 Android 项目中,我有一个在 JNI 中实现的 native 方法,如下所示:

public static double 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 呢? 这就是我在model{} 中为 NDK 所拥有的内容@

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 > directoryjni 旁边手动创建了 jniLibs 文件夹。我还添加了一个 armeabi 文件夹并将 TestLib.so 放入其中。我试过没有armeabi,但没有运气。

我在这里缺少什么?我完全迷路了!感谢您的帮助!

【问题讨论】:

  • 如果您愿意,您可以使用预构建的库,但您也可以使用 experimental 插件编译您的 TestClass.cpp。跨度>
  • @AlexCohn 正如我的帖子所说,我已经尝试使用已编译的共享库(如您所说的预构建)解决方案,但问题在于编译时不会发生的链接,因此问题出在哪里我的库根本没有被检测到,因此无法使用。
  • 我看不到您的 build.gradle,但我相信问题恰恰在于混合了这两种方法。如果问题仍然相关,我可能会帮助您找到出路。我相信在交互式聊天窗口中做起来会更容易。
  • 你的 build.gradle 是什么样的?我们需要知道您如何指定存储库...

标签: android c++ android-studio android-ndk java-native-interface


【解决方案1】:

请查看以下指南: http://www.shaneenishry.com/blog/2014/08/17/ndk-with-android-studio/ 我也在处理 .so 文件,但我认为您缺少以下内容:

安卓{

// .. android settings ..

sourceSets.main {
    jniLibs.srcDir 'src/main/myCppLibraries' // <-- Set your folder here!
}

}

你说得对,看起来 2.4 和 2.5 之间有变化 当我尝试使用 OpenCL 和 Andriod 时,以下配置对我有用: build.gradle(应用程序) ...

android.ndk{
moduleName = ""
ldLibs +=["android", "log", "OpenCL"]
cppFlags+="-I${file("src/main/jniLibs/")}".toString()
ldFlags += "-L${file("src/main/jniLibs/")}".toString()
}

...

应用结构:

app
-src
--main
---java
---jni
----test.c
---jniLibs
----libOpenCL.so

使用 gradle-experimental:0.2.0

【讨论】:

  • 谢谢,但是这篇文章不是最新的 Gradle 新语法。在tools.android.com/tech-docs/new-build-system/… 之后,我尝试添加:pastebin.com/ipVy8jzi 但仍然失败
  • 好吧,它似乎开始工作了,但我还没有。看看我的 gradle 文件(它的一部分):pastebin.com/F2DResdv 现在看看我的 CPP 文件:pastebin.com/2XizuFcE,当然,编译失败:Error:(6, 26) TestCppClass.h: No such file or directory 所以它仍然不起作用:/和顺便说一句,我必须在我的 gradle-wrapper.properties 文件中使用distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-all.zip
猜你喜欢
  • 2016-02-04
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多