我想使用来自另一个 Android 项目的现有原生库,所以我只是将 NDK 构建的库 (libcalculate.so) 复制到我的新 Android 项目中。在我的新 Android 项目中,我创建了一个文件夹 libs/armeabi/ 并将 libcalculate.so 放在那里。没有没有 jni/文件夹。我的测试设备采用 ARM 架构。
在我的 java 代码中,我通过以下方式加载库:
static{
System.loadLibrary("calculate");
}
当我运行我的新 android 项目时,出现错误:
java.lang.UnsatisfiedLinkError: ...
nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libcalculate.so"
所以,正如错误所说,复制的 native 库不在/verdor/lib 或/system/lib 中,在我的情况下如何解决这个问题?
(我解压了apk包,lib/下有libcalculate.so)
====更新=====
我还尝试在项目根目录下创建一个 jni/文件夹,并在 jni/下添加一个 Android.mk 文件。 Android.mk的内容是:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libcalculate
LOCAL_SRC_FILES := libcalculate.so
include $(PREBUILT_SHARED_LIBRARY)
然后,在项目根目录下,我执行了 ndk-build 。之后,通过ndk-build生成armeabi/和armeabi-v7a/目录(文件夹内有libcalculate.so)。
然后我成功运行我的 maven 构建项目。在最终的apk包中,有:
lib/armeabi/libcalculate.so
lib/armeabi-v7a/libcalculate.so
但是当我运行我的应用程序时,同样的错误抛出:
java.lang.UnsatisfiedLinkError: ...
nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libcalculate.so"
最佳答案
为了根本原因(也许同时解决您的问题),您可以这样做:
删除 jni 文件夹和所有 .mk 文件。如果您不编译任何内容,则不需要这些,也不需要 NDK。
复制您的libcalculate.so <project>/libs/(armeabi|armeabi-v7a|x86|...) 内的文件.使用 Android Studio 时为 <project>/app/src/main/jniLibs/(armeabi|armeabi-v7a|x86|...) ,但我看到你正在使用 eclipse。
构建您的 APK 并将其打开为 zip 文件,以检查您的 libcalculate.so文件在 lib/(armeabi|armeabi-v7a|x86|...) 中。
删除并安装您的应用程序
运行 dumpsys 软件包 | grep yourpackagename 以获取您的应用程序的 nativeLibraryPath 或 legacyNativeLibraryDir。
在您拥有的 nativeLibraryPath 或 legacyNativeLibraryDir/armeabi 上运行 ls,以检查您的 libcalculate.so 是否确实存在.
如果存在,请检查它是否没有从您的原始 libcalculate.so 文件中更改:它是否针对正确的架构编译,是否包含预期的符号,是否存在任何缺少的依赖项。您可以使用 readelf 分析 libcalculate.so。
为了检查步骤 5-7,您可以使用我的应用程序而不是命令行和 readelf:Native Libs Monitor
PS:很容易混淆 .so 文件应该放在哪里或默认生成,这里是一个总结:
libs/CPU_ABI 在 Eclipse 项目中
jniLibs/CPU_ABI 在 Android Studio 项目中
jni/CPU_ABI 在 AAR 中
lib/CPU_ABI 在最终 APK 中
在 <5.0 设备上的应用="">5.0>nativeLibraryPath 内,以及在 >=5.0 设备上应用的 legacyNativeLibraryDir/CPU_ARCH 内。
其中 CPU_ABI 是以下任一项:armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64。取决于您所针对的架构以及您的库已针对哪些架构进行编译。
还请注意,库不会在 CPU_ABI 目录之间混合:您需要使用的全套库,armeabi 文件夹中的库不会安装在 armeabi-v7a 设备,如果在 APK 的 armeabi-v7a 文件夹中有任何库。
关于android - System.loadLibrary(...) 在我的情况下找不到 native 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27421134/
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe
我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我已经看到了一些其他的问题,尝试了他们的建议,但没有一个对我有用。我已经使用Rails大约一年了,刚刚开始一个新的Rails项目,突然遇到了问题。我卸载并尝试重新安装所有Ruby和Rails。Ruby很好,但Rails不行。当我输入railss时,我得到了can'tfindgemrailties。我当前的Ruby版本是ruby2.2.2p95(2015-04-13修订版50295)[x86_64-darwin15],尽管我一直在尝试通过rbenv设置ruby2.3.0。如果我尝试rails-v查看我正在运行的版本,我会得到同样的错误。我使用的是MacOSXElCapitan版本10
我正在学习Rails,对Sinatra和Merb知之甚少。我想知道您会在哪些情况下使用Merb/Sinatra。感谢您的反馈! 最佳答案 Sinatra是一个比Rails更小、更轻的框架。如果你想让一些东西快速运行,只需发送几个URL并返回一些简单的内容,就可以使用它。看看Sinatrahomepage;这就是启动和运行“Hello,World”所需的全部内容,而在Rails中,您需要生成整个项目结构、设置Controller和View、设置路由等等(我还没有有一段时间写了一个Rails应用程序,所以我不知道“Hello,World
s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成
我花了几天时间尝试安装ruby1.9.2并让它与gems一起工作:-/我最终放弃了我的MacOSX10.6机器,下面是我的Ubuntu机器上的当前状态。任何建议将不胜感激!#rubytest.rb:29:in`require':nosuchfiletoload--mongo(LoadError)from:29:in`require'fromtest.rb:1:in`'#cattest.rbrequire'mongo'db=Mongo::Connection.new.db("mydb")#gemwhichmongo/usr/local/rvm/gems/ruby-1.9.2-p0/g