Golang使用gomobile构建时遇到重定义错误怎么解决
Golang使用gomobile构建时遇到重定义错误怎么解决
我正在使用 gomobile 构建 .arr 文件,但在 gobind 过程中遇到了错误。
我使用的构建命令是:GOARCH=arm64 CGO_ENABLED=0 GOOS="android" GOSUMDB=off gomobile bind -target android -v
我遇到的错误是: bitbucket.org/exium-c2/exue/common exue gobind/gobind
gobind/gobind
exue_android.c:729:1: error: redefinition of ‘Java_exue_UserInitConfig_getWorkspace’
exue_android.c:387:1: note: previous definition is here
exue_android.c:804:1: error: redefinition of ‘Java_exue_UserInitConfig_getSupi’
exue_android.c:369:1: note: previous definition is here
exue_android.c:924:1: error: redefinition of ‘Java_exue_UserInitConfig_getLastConnectedServer’
exue_android.c:343:1: note: previous definition is here
gomobile: go build -v -buildmode=c-shared -o=/tmp/gomobile-work-1136567776/android/src/main/jniLibs/armeabi-v7a/libgojni.so ./gobind failed: exit status 2
更多关于Golang使用gomobile构建时遇到重定义错误怎么解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang使用gomobile构建时遇到重定义错误怎么解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这个重定义错误通常是由于Go包结构或gomobile绑定配置问题导致的。以下是几种可能的解决方案:
1. 检查包结构
确保你的Go包没有循环依赖或重复的包名。检查是否有多个包定义了相同的Java类名。
// 检查你的包结构,确保没有重复的包路径
// 例如,避免这样的情况:
// - bitbucket.org/exium-c2/exue/common
// - bitbucket.org/exium-c2/exue/common/subpackage
// 其中都定义了相同的Java绑定接口
2. 清理并重新构建
首先清理gomobile缓存,然后重新构建:
# 清理gomobile缓存
gomobile clean
# 重新初始化gomobile
gomobile init
# 重新构建,添加-ldflags="-s -w"可能有助于减少冲突
GOARCH=arm64 CGO_ENABLED=0 GOOS="android" GOSUMDB=off gomobile bind -target android -v -ldflags="-s -w"
3. 检查Java类名冲突
确保你的Go包中所有导出的结构体和方法没有命名冲突:
// 检查是否有重复的Java类名
package main
import "golang.org/x/mobile/bind/seq"
// 确保UserInitConfig在项目中只定义一次
type UserInitConfig struct {
// 字段定义
}
// 检查方法名是否唯一
func (c *UserInitConfig) GetWorkspace() string {
return c.workspace
}
// 避免重复的方法签名
4. 使用gomobile绑定选项
尝试使用gomobile的-javapkg选项指定不同的Java包名:
GOARCH=arm64 CGO_ENABLED=0 GOOS="android" GOSUMDB=off gomobile bind \
-target android \
-v \
-javapkg com.yourcompany.exue \
-ldflags="-s -w"
5. 检查Go模块版本
确保所有依赖的版本一致,避免版本冲突:
# 清理go模块缓存
go clean -modcache
# 更新所有依赖
go mod tidy
# 验证模块图
go mod graph | grep exue
6. 简化构建命令
尝试使用更简单的构建命令,排除可能的环境变量干扰:
# 简化构建命令
gomobile bind -target=android/arm64 -v ./...
7. 检查CGO相关代码
虽然你设置了CGO_ENABLED=0,但检查是否有残留的C代码引用:
// 确保没有cgo导入
// 错误的示例:
/*
#include <stdlib.h>
*/
import "C"
// 应该完全避免cgo代码
8. 临时解决方案
如果上述方法都不行,可以尝试手动清理临时文件:
# 删除gomobile工作目录
rm -rf /tmp/gomobile-work-*
# 或者指定不同的工作目录
export TMPDIR=/path/to/clean/tmp
gomobile bind -target android -work -v
错误信息显示Java_exue_UserInitConfig相关函数被重复定义,这通常表明gomobile在生成JNI绑定代码时遇到了重复的Go类型或方法。检查你的项目中是否有多个包导出了相同的结构体或接口。

