当前位置: 首页 > 知识库问答 >
问题:

协议缓冲区gradle支持静态编程语言Android不工作?

尉迟俊能
2023-03-14

我有一个Android项目在静态编程语言,它是正确设置和工作

在根build.gradle

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

应用内构建。格拉德尔

apply plugin: 'kotlin-android'
// ...
implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"

所有工作良好。

根据https://github.com/google/protobuf-gradle-plugin,它也有原型支持

应用程序build.gradle它有

apply plugin: 'com.google.protobuf'
// ...
protobuf {
    protoc {
        // Download from repositories
        artifact = 'com.google.protobuf:protoc:3.0.0'
    }

    plugins {
        javalite {
            // The codegen for lite comes as a separate artifact
            artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
        }
    }
    generateProtoTasks {
        all().each { task ->
            task.plugins {
                javalite { }
            }
        }
    }
}

sourceSets {
    main {
        java {
            srcDirs += file("${protobuf.generatedFilesBaseDir}/debug/javalite")
        }
    }
}

// ...
api 'com.google.protobuf:protobuf-lite:3.0.0'

唯一的问题是,当访问Protobuf的代码生成代码时,即com中的代码。elyeproj公司。原型* ,是Java语言,一切正常

package com.elyeproj.myapplication;

import com.elyeproj.proto.Card;
import com.elyeproj.proto.Heart;
import com.elyeproj.proto.Result;
import com.elyeproj.proto.Spade;

public class MainPresenter {

    private MainView mainView;

    public MainPresenter(MainView mainView) {
        this.mainView = mainView;
    }

    public void fetchData() {
        Card card1 = Card.newBuilder().setHeart(Heart.newBuilder().build()).build();
        Card card2 = Card.newBuilder().setSpade(Spade.newBuilder().build()).build();
        Result result = Result.newBuilder().addCards(card1).addCards(card2).build();
        mainView.showResult(result.toString());

    }
}

但是,当转换为静态编程语言时

package com.elyeproj.myapplication

import com.elyeproj.proto.Card
import com.elyeproj.proto.Heart
import com.elyeproj.proto.Result
import com.elyeproj.proto.Spade

class MainPresenter(private val mainView: MainView) {

    fun fetchData() {
        val card1 = Card.newBuilder().setHeart(Heart.newBuilder().build()).build()
        val card2 = Card.newBuilder().setSpade(Spade.newBuilder().build()).build()
        val result = Result.newBuilder().addCards(card1).addCards(card2).build()
        mainView.showResult(result.toString())

    }
}

它将在编译时使用以下消息呈现错误:

Error:(6, 21) Unresolved reference: proto
Error:(11, 21) Unresolved reference: Card
Error:(11, 48) Unresolved reference: Heart
Error:(12, 48) Unresolved reference: Spade
Error:(13, 22) Unresolved reference: Result

即它无法访问那些原型生成的代码(尽管在Android Studio中,它仍然可以访问代码,例如代码自动完成可以找到功能)。

看起来Protobuf Gradle支持,Kotlin没有工作。还是我错过了什么?

为了测试它,您可以使用Java中的主呈现https://github.com/elye/issue_android_protobuf_light_java访问代码,这可以很好地编译。但是如果转换为静态编程语言,它会呈现如上所述的错误。

共有2个答案

荣沈义
2023-03-14

在获得Kotlin支持方面有一个变通方法,即使用Kotlin模块生成protobuf文件。然后作为一个单独的模块,可以使用它。退房https://medium.com/@elye。项目/android-protobuf-in-kotlin-a1c33014a4e2了解更多详细信息。

澹台景辉
2023-03-14

我刚刚在我的项目中解决了这个问题。也许你可以试试我的解决方案。正在应用程序内部版本中添加以下配置。格拉德尔:

android {
    ...
     // Adding generated proto to srcDirs depending on build variant
     variantFilter { variant ->
        def sourceSet = android.sourceSets.findByName(variant.buildType.name)
         if (sourceSet != null) {
             sourceSet.java.srcDirs += "build/generated/source/proto/${variant.name}/javalite"
        }
    }
    ...
}

//Running generating proto task before compiling Kotlin
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    mustRunAfter tasks.withType(com.google.protobuf.gradle.GenerateProtoTask)
}
 类似资料:
  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 我正在尝试使用柯特林 V1.2.70、Gradle V4.10.1 和 Java 11。使用 gradle 编译项目时,出现错误,指出“未知的 JVM 目标版本:11。支持的版本:1.6,1.8“。 Kotlin 编译器是否支持 Java 11(生成与 Java 11 JVM 兼容的代码)?如果是这样,如何使用渐变配置?

  • 我正在尝试更新Android BluetoothChat示例的代码,以使用Protobuf进行更结构化的数据交换。我还需要byte[]数组字段来发送任意数据,如图像字节数组,但在尝试编译时。proto文件,我得到以下错误。 协议文件/蓝牙消息。proto:8:18:应为字段名。 下面是我的. proto文件。 stackoverflow上的其他几个帖子提到byte[]可以用作文件,下面的页面也说了

  • 静态编程语言是否支持已命名的regex组? 命名的regex组看起来像这样:

  • 试图使用Ionic 4中的协议缓冲区进行编码 我已经下载了协议并用它来生成一堆_pb.js文件,每个. proto文件一个。很好。 首先关注原型示例。这是示例代码: 我做了一些更改以匹配我的文件。更改proto文件的名称。但是我的proto文件中没有包名称。所以我只是使用了消息名称。首先这是我的. proto文件的开头: 下面是我修改后的代码: 这似乎不起作用。我的控制台显示: 我相信我已经成功地

  • 问题内容: 我正在使用gSoap将旧式C 系统重构为SOA。我们遇到了一些性能问题(非常大的XML),因此我的领导要我看一下协议缓冲区。我做到了,它看起来非常酷(我们需要C 和Java支持)。但是协议缓冲区是仅用于序列化的解决方案,现在我需要将其发送到Java前端。从C ++和Java角度来看,我应该使用什么来通过HTTP(只是内部网络)发送那些序列化的内容? PS。另一个人试图加速我们的gSoa