我正在使用纯 C 语言和最新的 Android NDK 开发应用程序。我注意到 *.so 永远不会从内存中清除,因此全局变量会保留上次应用程序运行时的值,例如考虑以下代码:
static int init = 0;
void android_main(struct android_app* state)
{
init = 1;
dostuff();
}
当我的应用程序第一次启动时,“init”为 0 并设置为 1。从第二次运行开始,“init”将始终为 1,因为 *.so 仍在内存中。但我希望在调用 android_main() 时将全局变量重置为其默认值!
那么有什么方法可以确保在调用 android_main() 之前始终重置全局变量,还是我必须手动执行此操作? (这对我的应用程序来说是一项巨大的工作,因为我有大量全局变量分布在不同的 *.c 源中)
谢谢!
最佳答案
你有点进退两难。在共享库中初始化全局数据的岩石本身从未真正“初始化”。初始值实际上在 .so 文件本身的 DATA 部分中,这些部分只是在加载时复制到内存中,瞧!初始化数据。
困难的地方是 Java JNI 在设计上没有 UnloadLibrary(),并指定忽略对已加载库的 LoadLibrary() 调用。
这更加复杂,因为您使用的是 Android NativeActivity 助手,它隐藏了您,使您无法看到任何实际加载库的 Java 以及 Activity 代码本身,您可能(可能)能够在其中结束 Activity 当您的 native 代码完成时。
不过,我不确定放弃 NativeActivity 并只编写一个薄的 JNI shim 会有多大帮助,因为无论如何你仍然无法卸载或重新加载 native 代码,并且显式结束 Android 中的 Activity 可以有点棘手。事实上,我敢打赌你可以让 Activity 干净利落地结束——这不是我做的,所以我不是很熟悉。
另一种可能性是构建 2 个 native 库。一个就是您的应用程序,其中根本没有特定于 Android 的代码。另一个库将是由 NativeActivity 加载的库 - 使用 android_main() 和所有 - 它将使用 dlopen()/dlsym()/dlclose() C API 来加载、运行和清理“app”库。
我认为它可以工作 - 但我从未尝试过。用于执行共享库内容的 header (dlfcn.h) 在 NDK 中。
关于android - 在 Android NDK 上将全局变量初始化为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6375495/
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.