Gradle 2.5实验:包括.so库和来自JNI的电话

时间:2015-09-22 13:13:31

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

我的问题是我找不到合适的文档/指南,以便正确设置我的环境。

基本上我使用的是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方面我找不到任何帮助。我尝试了许多其他解决方案,但它们不起作用,因为它们似乎已经过时了。

我创建了一个简单的 C ++库 .so 文件来测试NDK支持&在Google I / O 2015期间宣布的Android Studio 1.3应该更好的集成。

这就是我非常简单的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项目中,我有一个 native 方法,该方法在JNI中实现如下:

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 !
    }

这是我得到的错误:

  

错误:任务执行失败   ':应用程序:linkArm64-v8aDebugMyAwesomeJNISharedLibrary'

     
    

构建操作失败。           链接libMyAwesomeJNI.so时链接器失败。查看完整的日志:     文件:/// C:/Users/Me/Documents/MyProject/app/build/tmp/linkArm64-v8aDebugMyAwesomeJNISharedLibrary/output.txt

  

我使用New > directory手动创建 jniLibs 文件夹以及 jni 。我还添加了一个 armeabi 文件夹,并将 TestLib.so 放入其中。我试过没有armeabi,但没有运气。

我在这里缺少什么?我完全迷失了!谢谢你的帮助!

1 个答案:

答案 0 :(得分:-1)

查看以下指南: http://www.shaneenishry.com/blog/2014/08/17/ndk-with-android-studio/ 我也在努力使用.so文件,但我认为你错过了以下内容:

android {

// .. android settings ..

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

}

你是对的,看起来在2.4和2.5之间有变化 当我尝试使用OpenCL&amp; amp;时,以下配置对我有用。 Andriod的: build.gradle(app) ...

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