我有一个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访问代码,这可以很好地编译。但是如果转换为静态编程语言,它会呈现如上所述的错误。
在获得Kotlin支持方面有一个变通方法,即使用Kotlin模块生成protobuf文件。然后作为一个单独的模块,可以使用它。退房https://medium.com/@elye。项目/android-protobuf-in-kotlin-a1c33014a4e2了解更多详细信息。
我刚刚在我的项目中解决了这个问题。也许你可以试试我的解决方案。正在应用程序内部版本中添加以下配置。格拉德尔:
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