2015-05-19 5 views
0

Я работаю над портированием моего libgdx игры, чтобы поддержать зависимость инъекций через Graddle 2.Libgdx и Dagger 2 - не генерировать код

Проблемы я встречая это не кажется, что крестик будет порождающим код для моих компонентов , Я считаю, что проблема заключается в том, как libgdx справляется с файлами градиента и как он разбивает их на разные операционные системы.

Весь мой проект (очень неполный) можно найти here, но я собираюсь опубликовать код проекта, предназначенного только для Android.

Мой build.gradle для всего проекта:

buildscript { 
    repositories { 
     mavenCentral() 
     maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:1.0.0' 
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' 
    } 
} 

allprojects { 
    apply plugin: "eclipse" 
    apply plugin: "idea" 

    version = '1.0' 
    ext { 
     appName = 'Aquifree' 
     gdxVersion = '1.5.5' 
     roboVMVersion = '1.0.0' 
     box2DLightsVersion = '1.3' 
     ashleyVersion = '1.3.1' 
     aiVersion = '1.5.0' 
    } 

    repositories { 
     mavenCentral() 
     maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } 
     maven { url "https://oss.sonatype.org/content/repositories/releases/" } 
    } 
} 

project(":android") { 
    apply plugin: "android" 
    apply plugin: 'com.android.application' 
    apply plugin: 'com.neenbedankt.android-apt' 

    configurations { natives } 

    dependencies { 
     compile project(":core") 
     compile "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion" 
     natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi" 
     natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" 
     natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" 
     compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion" 
     natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-armeabi" 
     natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-armeabi-v7a" 
     natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-x86" 
     compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion" 
     natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi" 
     natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a" 
     natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86" 
     apt 'com.google.dagger:dagger-compiler:2.0' 
     //provided 'javax.annotation:jsr250-api:1.0' 
     provided 'com.google.dagger:dagger-compiler:2.0' 
     provided 'org.glassfish:javax.annotation:10.0-b28' 
    } 
} 

project(":core") { 
    apply plugin: "java" 


    dependencies { 
     compile "com.badlogicgames.gdx:gdx:$gdxVersion" 
     compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion" 
     compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion" 
     compile 'com.google.dagger:dagger:2.0' 
    } 
} 

tasks.eclipse.doLast { 
    delete ".project" 
} 

Мой build.gradle для андроида модуля:

android { 
    buildToolsVersion "21.1.2" 
    compileSdkVersion 22 
    sourceSets { 
     main { 
      manifest.srcFile 'AndroidManifest.xml' 
      java.srcDirs = ['src'] 
      aidl.srcDirs = ['src'] 
      renderscript.srcDirs = ['src'] 
      res.srcDirs = ['res'] 
      assets.srcDirs = ['assets'] 
     } 

     instrumentTest.setRoot('tests') 
    } 
} 
// needed to add JNI shared libraries to APK when compiling on CLI 
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask -> 
    pkgTask.jniFolders = new HashSet<File>() 
    pkgTask.jniFolders.add(new File(projectDir, 'libs')) 
} 

// called every time gradle gets executed, takes the native dependencies of 
// the natives configuration, and extracts them to the proper libs/ folders 
// so they get packed with the APK. 
task copyAndroidNatives() { 
    file("libs/armeabi/").mkdirs(); 
    file("libs/armeabi-v7a/").mkdirs(); 
    file("libs/x86/").mkdirs(); 

    configurations.natives.files.each { jar -> 
     def outputDir = null 
     if(jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a") 
     if(jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi") 
     if(jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86") 
     if(outputDir != null) { 
      copy { 
       from zipTree(jar) 
       into outputDir 
       include "*.so" 
      } 
     } 
    } 
} 

task run(type: Exec) { 
    def path 
    def localProperties = project.file("../local.properties") 
    if (localProperties.exists()) { 
     Properties properties = new Properties() 
     localProperties.withInputStream { instr -> 
      properties.load(instr) 
     } 
     def sdkDir = properties.getProperty('sdk.dir') 
     if (sdkDir) { 
      path = sdkDir 
     } else { 
      path = "$System.env.ANDROID_HOME" 
     } 
    } else { 
     path = "$System.env.ANDROID_HOME" 
    } 

    def adb = path + "/platform-tools/adb" 
    commandLine "$adb", 'shell', 'am', 'start', '-n', 'com.lucascauthen.aquifree.android/com.lucascauthen.aquifree.android.AndroidLauncher' 
} 

// sets up the Android Eclipse project, using the old Ant based build. 
eclipse { 
    // need to specify Java source sets explicitely, SpringSource Gradle Eclipse plugin 
    // ignores any nodes added in classpath.file.withXml 
    sourceSets { 
     main { 
      java.srcDirs "src", 'gen' 
     } 
    } 

    jdt { 
     sourceCompatibility = 1.6 
     targetCompatibility = 1.6 
    } 

    classpath { 
     plusConfigurations += [ project.configurations.compile ]   
     containers 'com.android.ide.eclipse.adt.ANDROID_FRAMEWORK', 'com.android.ide.eclipse.adt.LIBRARIES'  
    } 

    project { 
     name = appName + "-android" 
     natures 'com.android.ide.eclipse.adt.AndroidNature' 
     buildCommands.clear(); 
     buildCommand "com.android.ide.eclipse.adt.ResourceManagerBuilder" 
     buildCommand "com.android.ide.eclipse.adt.PreCompilerBuilder" 
     buildCommand "org.eclipse.jdt.core.javabuilder" 
     buildCommand "com.android.ide.eclipse.adt.ApkBuilder" 
    } 
} 

// sets up the Android Idea project, using the old Ant based build. 
idea { 
    module { 
     sourceDirs += file("src"); 
     scopes = [ COMPILE: [plus:[project.configurations.compile]]]   

     iml { 
      withXml { 
       def node = it.asNode() 
       def builder = NodeBuilder.newInstance(); 
       builder.current = node; 
       builder.component(name: "FacetManager") { 
        facet(type: "android", name: "Android") { 
         configuration { 
          option(name: "UPDATE_PROPERTY_FILES", value:"true") 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Мой build.gradle для основного модуля:

apply plugin: "java" 

sourceCompatibility = 1.6 
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8' 

sourceSets.main.java.srcDirs = [ "src/" ] 


eclipse.project { 
    name = appName + "-core" 
} 

Мой класс класса AssetLoaderModule.java:

package com.lucascauthen.modules; 
import com.lucascauthen.util.AssetLoader; 


import javax.inject.Singleton; 

import dagger.Module; 
import dagger.Provides; 


@Module 
public class AssetLoaderModule { 
    @Provides @Singleton 
    AssetLoader provideAssetLoader() { 
     return new AssetLoader(); 
    } 
} 

Мой компонент AssetLoaderComponent.java

package com.lucascauthen.components; 

import com.lucascauthen.util.AssetLoader; 

import javax.inject.Singleton; 

import dagger.Component; 


@Singleton 
@Component(modules = {AssetLoader.class}) 
public interface AssetLoaderComponent { 
    AssetLoader provideAssetLoader(); 
} 

Наконец, и случай, когда я пытаюсь создать объект AssetLoader:

package com.lucascauthen.screens.MenuItems; 

import com.lucascauthen.components.AssetLoaderComponent; 
import com.lucascauthen.components.*; 

import com.lucascauthen.util.AssetLoader; 

public abstract class MenuItem { 
    protected AssetLoader assetLoader; 
    public abstract void dispose(); 
    public MenuItem() { 
     AssetLoaderComponent component = DaggerAssetLoaderComponent.create(); 
     assetLoader = component.provideAssetLoader(); 
    } 
} 

Проблема возникает на линии с DaggerAssetLoaderComponent.create() компилятор не распознает символ и, следовательно, код генерируется.

То, что я пробовал:

  • Очистка/строительство/монтаж проект
  • Добавление зависимостей/плагин для андроида модуля самого
  • Проверки файлов проекты, чтобы увидеть, если код есть, но просто скрывается (его нет)
  • Я установил кинжал в проект без libgdx и получил его, чтобы он работал нормально
  • Я пробовал использовать аннотации как из натуральной рыбы, так и аннотации jrs250
  • Я попытался ограничить проект только андроидом, используя установочный файл для создания проекта только для Android. (Ссылка github содержит код не только для операционной системы Android)

На данный момент я думаю, что это просто глупо в отношении того, как я добавляю разные файлы в различные файлы build.gradle. Если вам нужна дополнительная информация, пожалуйста, прокомментируйте ниже.

+0

От всего дня я работал над попыткой заставить это работать, похоже, что libgdx и кинжал 2 несовместимы. Однако я не знаю, почему. –

+0

Я тоже работаю над этим. Я вижу класс сгенерированный и получаю класс Dagger. Сначала IntelliJ IDEA не «видел» код, потому что по умолчанию файл .java генерируется в сборке/промежуточных/классах, вместо build/generated/source/apt. Вы находите DaggerAssetLoaderComponent.java где-то в каталоге сборки? –

+0

Когда я это пробовал, я не мог найти сгенерированные файлы, как если бы они никогда не создавались. –

ответ

2

Он хорошо работает в нашем проекте, но у нас есть очень настраиваемая конструкция градиента в нашем проекте libgdx.

Подходящие фрагменты build.gradle ниже.

проект корень сборка.Gradle:

 buildscript { 
     repositories { 
      mavenCentral() 
      jcenter() 
      maven { 
       url "https://plugins.gradle.org/m2/" 
      } 

     } 
     dependencies { 
      classpath 'com.android.tools.build:gradle:1.2.3' 

      // Android apt (without this, .java files are generated in classes dir instead of generated sources dir) 
      // resulting in errors IDE 
      classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' 

      // Desktop apt (without this, .java files are generated in classes dir instead of generated sources dir) 
      // resulting in errors IDE 
      classpath "net.ltgt.gradle:gradle-apt-plugin:0.3" 
     } 
    } 

    allprojects { 
     repositories { 
      mavenCentral() 
      maven { url "https://oss.sonatype.org/content/repositories/releases/" } 
     } 
    } 

В андроида модуле neenbedankt андроид-склонный плагин должен быть применен:

apply plugin: 'com.neenbedankt.android-apt' 

В настольном модуле, ltgt склонный плагин должен быть применен. Кроме того, необходимо применять плагин идеи, иначе сборка/сгенерированная/source/apt/main не распознается как исходная папка по IDEA.

apply plugin: "net.ltgt.apt" 
apply plugin: 'idea' // plugin needed to make IDEA see build/generated/source/apt/main as sourcefolder. 
+0

Я проверю, скоро ли это работает для меня. Спасибо! –

Смежные вопросы