所以我写了一个go文件,它将一个库动态附加到apex_defaults-> multilib-> first-> native_shared_libs;
的完整代码Android.bp
可在此处查看。但是,我无法像其他生成的lib
.so文件那样在out目录中看到已编译的.so文件。
详细说明:
我想将名为“
libabcxtractor”的库添加到数组native_shared_libs;为此,我写了一个.go
文件(由Google推荐),其条件如下所示:
package my_apex
import (
"android/soong/android"
"android/soong/apex"
"fmt"
"strings"
)
func globalFlags(ctx android.BaseContext) []string {
var native_shared_libs []string
if(strings.Contains(ctx.AConfig().DeviceName(), "my_apex_device")){
fmt.Println("Some log to verify condition is getting executed......")
native_shared_libs = append(native_shared_libs, "libabcextractor")
}
return native_shared_libs
}
func myApexFlagsDefaults(ctx android.LoadHookContext) {
type props struct {
Multilib struct {
First struct {
native_shared_libs []string
}
}
}
p := &props{}
p.Multilib.First.native_shared_libs = globalFlags(ctx)
ctx.AppendProperties(p)
}
func myApexFlagsDefaultsFactory() android.Module {
module := apex.DefaultsFactory()
android.AddLoadHook(module, myApexFlagsDefaults)
return module
}
func init() {
fmt.Println("Registering module type....")
android.RegisterModuleType("my_apex_defaults", myApexFlagsDefaultsFactory)
}
为了使上述条件能够在构建时被选择,我已经更新了我的Android.bp
文件,如下所示:
bootstrap_go_package {
name: "soong-my_apex",
pkgPath: "frameworks/av/apex/build",
deps: [ "soong-apex" ],
srcs: [ "my_apex.go", ],
pluginFor: ["soong_build"],
}
my_apex_defaults {
name: "my_apex",
}
apex_defaults {
name: "com.android.media-defaults",
java_libs: ["updatable-media"],
defaults: ["my_apex",] //THIS IS TO INCLUDE GO IMPLEMENTATION
multilib: {
执行make命令时,我可以看到它进入了条件语句;日志正在打印。我.go
通过检查路径来验证我的文件是否已编译来进一步调查out/soong/.bootstrap/soong- my_apex/pkg/frameworks/av/apex/build.a
。在那里。但是没有生成的".so"
文件libabcextractor
。任何帮助都会很棒。
编辑:
libabcextractor
是位于预构建路径中的供应商库。如果我尝试使用属于AOSP代码一部分并且native_static_libs
已经存在于现有数组中的任何其他库,那么它们也不适用于它们。从这里开始,由于没有适当的文档,我无法进一步调试。
Go中的Reflection只能访问导出的struct字段,这些字段以大写字母开头。在您的First
结构中,native_shared_libs
未导出,因此无法使用反射进行访问。
由于构建过程使用反射来访问props
结构,因此无法从中找到信息。您可以这样更改:
type props struct {
Multilib struct {
First struct {
Native_shared_libs []string
}
}
}
当我试图在模拟器x86-64上运行我的项目时,我遇到了崩溃。我试过很多不同的解决办法,但没有人帮助我解决我的问题。 Engine ;Mobile:本机库加载失败:java.lang.unsatifiedLinkError:dalvik.system.pathClassLoader[DexpathList[[zip文件“/data/app/package-name-1/base.apk”],nati
当我试图在仿真器x86-64上运行我的项目时,我遇到了崩溃。我试过很多不同的解决方法,但没有人帮我解决我的问题。 工程 ;移动:本机库无法加载:java.lang.UnsatisfiedLinkError:Dalvik.System.PathClassLoader[DexPathList[[zip文件“/data/app/package-name-1/base.apk”],NativeLibrar
问题内容: 我有一个遵循标准目录布局的项目设置(虽然未使用Maven): 本机DLL位于资源文件夹中,而源位于Java文件夹中。resources文件夹是Java类路径的成员。 我现在想加载DLL,而不必设置JRE 选项或设置变量,以便可以通过简单的双击来启动生成的jar文件。 运行jar文件时是否可以将资源文件夹添加到库搜索路径而无需进行其他配置?例如,设置与清单中的相似? 问题答案: 直到今天
在运行jar文件时,有没有可能将资源文件夹添加到库搜索路径中,而不必做额外的配置?例如。使用与清单中的类似的设置?
我正在Linux中的Websphere Liberty下安装多个应用程序。每个应用程序都需要引用相同的共享库,后者加载一个本机驱动程序;库必须加载到它自己的类加载器中。 在以前的Websphere(8+)版本中,使用UI以这种方式配置库非常简单:设置作用域,给它一个名称,标识类路径上的JAR,提供本机库路径,然后勾选“use an isolated class Loader”。自由就不一样了。 假