简体   繁体   English

创建创建输出jar的自定义gradle项目时出现问题

[英]Issue creating a custom gradle project that outputs a jar

I currently have a custom build.gradle that cmake's and builds a SWIG c++ project and generates a jar file for use in my android project. 我目前有一个自定义的build.gradle,它可以cmake并构建一个SWIG c ++项目并生成一个jar文件供我的android项目使用。 (The jar is generated within cmake) (罐子在cmake内生成)

My current setup works for the most part. 我当前的设置大部分都可以使用。 The jar file is correctly linked to my android project and it builds just fine. jar文件已正确链接到我的android项目,并且构建良好。 My only problem is that android studio does not recognize the library. 我唯一的问题是android studio无法识别该库。 No auto-complete is working and it underlines all uses of my library as an error. 没有自动完成功能,并且强调了将我的媒体库的所有使用作为错误。

c++ project build.gradle 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 project build.grade 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')
}

Each time I do "Sync project with gradle files" i get an exception: 每次我执行“使用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)

When I look at the gradle source it seems to be an assertion that the path passed into getModuleName is empty. 当我查看gradle源时,似乎断言传递给getModuleName的路径为空。

Might not help answer your question, but make sure to upgrade to Build Tools 19.0.1 and the Android Gradle plugin 0.8.1 (or whatever's most recent) from that of 18.1.1 and 0.7.+. 可能无法帮助您回答问题,但请确保从18.1.1和0.7。+升级到Build Tools 19.0.1和Android Gradle插件0.8.1(或最新版本)。 There have been a few bugs in the past while working with gradle/IntelliJ that have been caused by older versions of such. 过去使用gradle / IntelliJ时,存在一些由旧版本的bug引起的错误。 You'll want to ensure the Gradle wrapper is up to 0.10 but IntelliJ should prompt you about that. 您将要确保Gradle包装器最多为0.10,但是IntelliJ会提示您有关情况。

Might be related: https://code.google.com/p/android/issues/detail?id=62391 可能相关: https : //code.google.com/p/android/issues/detail? id =62391

Perhaps post more about your project structure... or since it's been over a month, let us know if you've found a fix ... :) 也许发布有关您的项目结构的更多信息...或者已经过去了一个多月,如果您已找到解决方法,请告诉我们... :)

if it is pure C++ project and there is no java code in it, may you build it as static or shared lib [including all ABI you want to support ], and have your project import the lib? 如果它是纯C ++项目,并且其中没有Java代码,您可以将其构建为静态或共享库[包括您要支持的所有ABI],并让您的项目导入该库吗? Android studio supports this import native lib thing with either gradle-experimental plugin http://tools.android.com/tech-docs/new-build-system/gradle-experimental or cmake/ndk-build plugin http://tools.android.com/tech-docs/external-c-builds Android Studio通过gradle-experimental插件http://tools.android.com/tech-docs/new-build-system/gradle-experimental或cmake / ndk-build插件http:// tools支持此导入本机lib东西。 android.com/tech-docs/external-c-builds

Some examples are in this repo https://github.com/googlesamples/android-ndk , master branch is for gradle-experimental, master-cmake is for cmake plugin. 此仓库https://github.com/googlesamples/android-ndk中的一些示例,master分支用于gradle-experimental,master-cmake用于cmake插件。 The specific sample similar to your case would be hello-libs [appears in both branches]. 与您的案例类似的特定示例是hello-libs(出现在两个分支中)。

Your will have your application project's java code call into its own native[c/c++] code; 您将把应用程序项目的Java代码调用成其自己的native [c / c ++]代码; then from those native code call your SWIG C++ lib. 然后从这些本机代码中调用您的SWIG C ++库。 In other words, application project needs a wrapper because it needs to deal with JNI code [I assume], and JNI code have your java class/package's signature in its jni function names. 换句话说,应用程序项目需要包装器,因为它需要处理JNI代码(我认为),并且JNI代码在其jni函数名称中具有Java类/程序包的签名。

I am not sure normal JAVA project could directly use a third party lib: the lib function names do not have package and java class name in it. 我不确定普通的JAVA项目是否可以直接使用第三方lib:lib函数名称中没有包和java类名称。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM