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

1 回复

更多关于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类型或方法。检查你的项目中是否有多个包导出了相同的结构体或接口。

回到顶部