2014-01-08 3 views
1

현재 cmake가 있고 SWIG C++ 프로젝트를 빌드하고 내 안드로이드 프로젝트에 사용할 jar 파일을 생성하는 사용자 정의 build.gradle이 있습니다. (항아리는 cmake 내에서 생성됩니다.)병을 출력하는 사용자 정의 gradle 프로젝트를 생성 할 때의 문제

현재 설치가 대부분 작동합니다. jar 파일은 내 안드로이드 프로젝트에 올바르게 링크되어 있으며 잘 빌드됩니다. 내 유일한 문제는 안드로이드 스튜디오가 라이브러리를 인식하지 못한다는 것입니다. 자동 완성 기능이 작동하지 않으며 내 라이브러리의 모든 용도에 오류가 있음을 강조합니다.

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

안드로이드 프로젝트 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. +에서 Build Tools 19.0.1 및 Android Gradle 플러그인 0.8.1 (또는 최신 버전)으로 업그레이드해야합니다. 이전 버전에서 발생했던 gradle/IntelliJ로 작업하는 동안 과거에는 몇 가지 버그가있었습니다. Gradle wrapper가 0.10까지 나오길 원하지만, IntelliJ는 그 점에 대해 물어볼 것입니다.

관련이 될 수도 있습니다 : https://code.google.com/p/android/issues/detail?id=62391

은 아마 당신의 프로젝트 구조에 대한 자세한 내용을 게시 ... 또는 한 달 지났 때문에, 당신이 수정 프로그램을 발견 한 경우 알려 ... :)

0

순수한 C++ 프로젝트이고 자바 코드가 없다면 정적 또는 공유 라이브러리 [지원할 ABI를 모두 포함]로 빌드하고 프로젝트에서 lib를 가져 오게 할 수 있습니까? 안드로이드 스튜디오 http://tools.android.com/tech-docs/external-c-builds

몇 가지 예는이 REPO https://github.com/googlesamples/android-ndk에 플러그인 Gradle을-실험 플러그인 http://tools.android.com/tech-docs/new-build-system/gradle-experimental 또는 cmake/NDK 빌드 중이 수입 기본 LIB 일을 지원, 마스터 분기 Gradle을-실험을위한, 마스터 cmake는 cmake 플러그인입니다 . 귀하의 경우와 유사한 특정 샘플은 hello-libs [두 브랜치 모두에 나타납니다]입니다.

응용 프로그램 프로젝트의 Java 코드가 고유 한 [c/C++] 코드로 호출됩니다. 그런 다음 네이티브 코드에서 SWIG C++ lib를 호출하십시오. 즉, JNI 코드를 처리해야하기 때문에 애플리케이션 프로젝트에 래퍼가 필요하며 JNI 코드에는 jni 함수 이름에 Java 클래스/패키지의 서명이 있습니다.

정상적인 JAVA 프로젝트에서 타사 라이브러리를 직접 사용할 수 있는지 잘 모르겠습니다. lib 함수 이름에 패키지 및 Java 클래스 이름이 없습니다.

관련 문제