2014-01-08 73 views
1

我目前有一个自定义的build.gradle cmake的和建立一个SWIG c + +项目,并生成一个jar文件在我的android项目中使用。 (这个罐子是在cmake中生成的)问题创建一个定制的gradle项目,输出一个jar

我目前的设置大部分工作。该jar文件正确链接到我的android项目,它的构建就好了。我唯一的问题是,android studio不能识别库。没有自动完成工作,并强调我的图书馆的所有用途作为错误。

C++项目的build.gradle

task cmakeMyLibrary(type: Exec) { 
    inputs.file 'CMakeLists.txt' 
    outputs.file 'Makefile' 

    ext.jarFile = new File(parent.buildDir, "mylibrary.jar") 

    commandLine 'cmake' ... 
} 

task makeMyLibrary(type: Exec, dependsOn: cmakeMyLibrary) { 

    inputs.dir '.' 

    outputs.file cmakeMyLibrary.jarFile 

    commandLine 'make', '-j10' 
} 

task cleanMyLibrary(type: Exec) { 
    commandLine 'make', 'clean' 
} 

configurations.create('default') 
artifacts { 
    it."default"(cmakeMyLibrary.jarFile) { 
     builtBy makeMyLibrary 
    } 
} 

Android项目build.grade

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.7.+' 
    } 
} 
apply plugin: 'android' 

repositories { 
    mavenCentral() 
} 

android { 
    compileSdkVersion 19 
    buildToolsVersion "18.1.1" 

    defaultConfig { 
     minSdkVersion 10 
     targetSdkVersion 19 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      runProguard false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 
} 

dependencies { 
    compile 'com.android.support:appcompat-v7:+' 
    compile project(':mylibrary') 
} 

每次我做 “的gradle与文件同步项目” 我得到一个异常:

Gradle 'MyApplication6' project refresh failed: 
exception during working with external system: java.lang.AssertionError 
at com.android.tools.idea.gradle.dependency.ModuleDependency.getModuleName(ModuleDependency.java:49) 
at com.android.tools.idea.gradle.dependency.ModuleDependency. (ModuleDependency.java:43) 
at com.android.tools.idea.gradle.dependency.Dependency.populate(Dependency.java:143) 
at com.android.tools.idea.gradle.dependency.Dependency.extractFrom(Dependency.java:106) 
at com.android.tools.idea.gradle.project.AndroidGradleProjectResolver.populateModuleDependencies(AndroidGradleProjectResolver.java:154) 
at org.jetbrains.plugins.gradle.service.project.GradleProjectResolver.doResolveProjectInfo(GradleProjectResolver.java:232) 
at org.jetbrains.plugins.gradle.service.project.GradleProjectResolver.access$000(GradleProjectResolver.java:60) 
at org.jetbrains.plugins.gradle.service.project.GradleProjectResolver$1.fun(GradleProjectResolver.java:116) 
at org.jetbrains.plugins.gradle.service.project.GradleProjectResolver$1.fun(GradleProjectResolver.java:112) 
at org.jetbrains.plugins.gradle.service.project.GradleExecutionHelper.execute(GradleExecutionHelper.java:190) 
at org.jetbrains.plugins.gradle.service.project.GradleProjectResolver.resolveProjectInfo(GradleProjectResolver.java:112) 
at org.jetbrains.plugins.gradle.service.project.GradleProjectResolver.resolveProjectInfo(GradleProjectResolver.java:60) 
at com.intellij.openapi.externalSystem.service.remote.RemoteExternalSystemProjectResolverImpl$1.produce(RemoteExternalSystemProjectResolverImpl.java:41) 
at com.intellij.openapi.externalSystem.service.remote.RemoteExternalSystemProjectResolverImpl$1.produce(RemoteExternalSystemProjectResolverImpl.java:37) 
at com.intellij.openapi.externalSystem.service.remote.AbstractRemoteExternalSystemService.execute(AbstractRemoteExternalSystemService.java:59) 
at com.intellij.openapi.externalSystem.service.remote.RemoteExternalSystemProjectResolverImpl.resolveProjectInfo(RemoteExternalSystemProjectResolverImpl.java:37) 
at com.intellij.openapi.externalSystem.service.remote.wrapper.ExternalSystemProjectResolverWrapper.resolveProjectInfo(ExternalSystemProjectResolverWrapper.java:49) 
at com.intellij.openapi.externalSystem.service.internal.ExternalSystemResolveProjectTask.doExecute(ExternalSystemResolveProjectTask.java:53) 
at com.intellij.openapi.externalSystem.service.internal.AbstractExternalSystemTask.execute(AbstractExternalSystemTask.java:130) 
at com.intellij.openapi.externalSystem.service.internal.AbstractExternalSystemTask.execute(AbstractExternalSystemTask.java:120) 
at com.intellij.openapi.externalSystem.util.ExternalSystemUtil$3.execute(ExternalSystemUtil.java:441) 
at com.intellij.openapi.externalSystem.util.ExternalSystemUtil$4$2.run(ExternalSystemUtil.java:504) 
at com.intellij.openapi.progress.impl.ProgressManagerImpl$TaskRunnable.run(ProgressManagerImpl.java:464) 
at com.intellij.openapi.progress.impl.ProgressManagerImpl$2.run(ProgressManagerImpl.java:178) 
at com.intellij.openapi.progress.ProgressManager.executeProcessUnderProgress(ProgressManager.java:209) 
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:212) 
at com.intellij.openapi.progress.impl.ProgressManagerImpl.runProcess(ProgressManagerImpl.java:171) 
at com.intellij.openapi.progress.impl.ProgressManagerImpl$8.run(ProgressManagerImpl.java:373) 
at com.intellij.openapi.application.impl.ApplicationImpl$8.run(ApplicationImpl.java:435) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:744) 
at com.intellij.openapi.application.impl.ApplicationImpl$1$1.run(ApplicationImpl.java:152) 

当我查看gradle源代码时,它似乎是断言传入getModuleName的路径为空。

回答

0

可能无法解答您的问题,但请务必从18.1.1和0.7的版本升级到构建工具19.0.1和Android Gradle插件0.8.1(或其他最新版本)。过去在使用由旧版本引起的gradle/IntelliJ时出现了一些错误。您需要确保Gradle包装达到0.10,但IntelliJ应该提示您。

可能涉及:https://code.google.com/p/android/issues/detail?id=62391

可能发布更多关于您的项目结构...或者因为它已经过了一个月,让我们知道,如果你已经找到了解决...... :)

0

如果它是纯粹的C++项目,并且没有Java代码,你可以将它构建为静态或共享库[包括你想要支持的所有ABI],并让你的项目导入库? Android的工作室支持与任何gradle这个实验性的插件http://tools.android.com/tech-docs/new-build-system/gradle-experimental或CMake的/ NDK-生成插件http://tools.android.com/tech-docs/external-c-builds

一些例子是在这个回购https://github.com/googlesamples/android-ndk此导入本地库的事,主分支是gradle这个实验性,主cmake的是cmake的插件。与你的情况类似的具体样本将是hello-libs [出现在两个分支]。

您将会将您的应用程序项目的java代码调用放入其自己的[c/C++]代码中;那么从这些本地代码调用你的SWIG C++库。换句话说,应用程序项目需要一个包装器,因为它需要处理JNI代码[我认为],并且JNI代码在其jni函数名称中具有您的java类/包的签名。

我不确定正常的JAVA项目可以直接使用第三方lib:lib函数名称中没有包和java类名。

相关问题