我的问题是我找不到合适的文档/指南,以便正确设置我的环境。
基本上我使用的是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{}
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
,但没有运气。
我在这里缺少什么?我完全迷失了!谢谢你的帮助!
答案 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