- Old Android version (4.4 on my side) didn’t look for shared library by SONAME inside. It only checks file name. For example, in recent Android version (7 or 8), one file named
libcrypto.sowhose SONAME is
libcrypto.so.1.0.0can be loaded by dependents successfully. But in old versions the system reported “dlopen failed to load libcrypto.so.1.0.0”.
- In Linux’s programming conventions, a shared library usually has name like
libxxxx.so.x.y.zand a symbolic link named
libxxxx.sowould also be created pointing to the former. That’s OK in a normal Linux system, but has problems with Android’s app. The android apk’s zip format didn’t recognize symbolic link, and as I described in 1. it also didn’t load shared library by SONAME.
- Android Studio integrated CMake to build native libraries and it also packs what generated by CMake
libsdirectory inside the apk. That’s good. But! But it packs only files with .so extension. So, files like
libxxxx.so.x.y.zwould be packed into the apk, and we don’t have any configurable option on both
CMakefile.txtto add them manually.
Long in short, after upgraded to Android Studio 3.0, symbols from aar binary modules cannot be resolved in IDE, although the building/make is successful. Clean or Rebuild project is useless.
Two steps solution:
- Change line
- Select ‘Invalidate Caches / Restart‘ from File menu.
That is, if a 32bit DLL was loaded by
CreateRemoteThread(), the DLL would be unloaded silently without
DLL_PROCESS_DETACH invocation sent to
DLLMain() of the DLL. There are indeed 2 weird issues, one is silent unloading, the other is no
This occurs on WOW64 environment of Windows 2008 Server R2 only. Windows 2012 and 2016 don’t have this issue, while x64 environment of 2008 also doesn’t have the issue.
To fix it, we can make the DLL depend on another DLL. The 2nd DLL can receive all notification callbacks of
DLLMain(). This way can fix the callback issue. And by adding an extra
LoadLibrary() call of 2nd DLL in 1st DLL’s
DLL_PROCESS_ATTACH notification, we can keep the 2nd DLL in memory even if 1st DLL unloaded silently.
In short, ffmpeg changes its API in recent versions. One of them is marking
AVStream.codec as deprecated. On other side, a AVCodecParameters
* AVStream.codecpar was added for codec information described in the stream. To decode data read from stream correctly, we must create a
avcodec_alloc_context3(), copy codec information from
AVStream.codecpar to this allocated
AVCodecContext, and call
avcodec_open2() to assign this
AVCodec found by
Here is the point. We must call
avcodec_parameters_to_context() to copy codec information to
AVCodecContext before we call
avcodec_open2() to assign
AVCodec. If we incorrectly reversed this order, say, called
avcodec_parameters_to_context(), we can still decode many videos correctly, but we will encounter strange behavior when we try to play back .mkv or .mp4 files – Each call to decoding function will fail.
if [ "$CONFIGURATION" == "Debug" ]; then LIBFFMPEG_DIR="$PROJECT_DIR/../../ffmpeg/ios/universal/debug" else LIBFFMPEG_DIR="$PROJECT_DIR/../../ffmpeg/ios/universal/release" fi for a in $ARCHS; do EXTRACT_ARCHS="$EXTRACT_ARCHS -extract $a" done lipo "$LIBFFMPEG_DIR/lib/libffmpeg.dylib" $EXTRACT_ARCHS -output "$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/libffmpeg.dylib" if [ "$CODE_SIGNING_REQUIRED" == "YES" ]; then codesign -s "$EXPANDED_CODE_SIGN_IDENTITY" "$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/libffmpeg.dylib" fi install_name_tool -change "libffmpeg.dylib" "@executable_path/libffmpeg.dylib" "$BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH"
Simply, clang has an option
'--no-integrated-as' so that the compiler invokes apple’s standalone
'as' assembler instead of using clang’s built-in. But, either has its own lost pieces.
'--no-integrated-as', clang would use its internal assembler. Unfortunately it doesn’t recognize the mnemonic
'as’ assembler reports an error in pesudo instruction
'.ios_version_min', which was apparently generated by clang itself.
Therefore I have no choice except for changing
'ldmltfd' to two simple instructions…
Passing file descriptors through unix domain socket is well-known. But there still have some tricks in implementation. I spent one day to deal with it in Mac OS X by digging into xnu source.
- How to pass multiple file descriptors in one
Simple. Put all file descriptors one by one after
- Can I put multiple
structcmsghdrs with data? I noticed there are
No. In xnu sources it checks
cmsghdr.cmsg_len. If they are not equal, a
-EINVALreturned in sendmsg
()call. That means only one cmsghdr can be put into msghdr.
The limitation is in OS X only. I haven’t check Linux and would do it soon or later.
There are many blogs and articles talked about this issue and resolution on Internet. But any of them has this or that problems in those solutions. So I took several hours on researches and got a perfect result, at least I think so. 🙂
Thought about device orientation change, table width and cell width will change. And since we are already use Auto Layout here, it is not a good practice to design cell with any implicit width, say, 320. in Interface Builder. Almost all solutions on Internet assumed 320 width implicitly so those solutions would fail on either landscape orientation, or, iPad if the app is a universal app and you use same cell design for both iPhone and iPad.
So, the problem is in [tableView: heightForRowAtIndexPath:] delegate method. This delegate method is required for iOS7 or the app would crash. To return a correct height value of the cell, we need those steps:
- Set cell width to table width after loaded the cell from xib.
- Set values for widgets including multi-line UILabel inside cell
- Call [cell setNeedsLayout] and [cell layoutIfNeeded]. After those 2 calls, system’s layout engine would set correct width for UILabels. Note at this time the label’s preferredMaxLayoutWidth is still zero or any value left from last using so the layout engine cannot wrap lines and adjust label’s frame correctly.
- Set label.preferredMacLayoutWidth = CGRectGetWidth(label.frame)
- Call [cell setNeedsLayout] and [cell layoutIfNeeded] again. This time labels have correct preferredMaxLayoutWidth and the layout engine would adjust label’s frame correctly
- Now you can call [systemLayoutSizeFittingSize:UILayoutFittingCompressedSize] to get correct height.
Solutions on Internet usually don’t do step 1 and 5. In an invariant screen size they can get correct display but they are not a real solution for other cases.
However, from iOS8 there is a simple solution. Apple solved the issue. Just returning UITableViewAutomaticDimension or just not implementing the method will get correct result. But for apps having to maintain compatibility with iOS7, we still have to do something like this.
因为要写一个从云端读取文件的程序, 首先想到的自然就是目前各家火爆的网盘服务了. 于是今天就花了点时间, 逐个看了一下. 当然, 因为是要写程序嘛, 所以网盘是否提供 API 当然就是重点了. 除了 API 之外, 也要能方便地从浏览器访问, 这样程序才有东西可以读, 对吧.
原来是有开放 API 的, 叫 PCSAPI (个人云服务), 但是现在已经不支持了. 新的移动接入方式在内测中, 只支持 Android, 并且需要申请. 申请表格中需要填写申请者详细信息以及应用本身的信息和下载方式. 申请之后需要审核, 也不知道要审核多久会不会有回应. 另外, 作为一个需要从云端下载文件的应用, 在你云端都还没有让我访问之前, 我怎么可能有应用存在并供你下载?
另外, 这个 android 的 SDK 还需要你在手机上安装了百度云的 app 才能工作.
2. 360 网盘
微盘有公开 API 支持, 开发者简单创建应用后即可使用. 很好. 但是微盘有个应用间微盘空间隔离的策略. 也就是任一应用都不能访问别的应用的存储空间, 也不能访问在 web 上访问到的微盘内容. 从 web 微盘页面上, 也看不到应用的存储空间. 这对于要从 web 传文件而应用只是下载的情形就不行了. 当然, 微盘也还是有可以访问全部空间的选择项的, 只不过也需要申请并审核. 不知道要审核多久会不会有回应.
华为 dbank 网盘做得其实也挺早的, 然而华为做云服务好象总是做不好. 目前华为网盘的注册登录界面到处都有 connection reset 的错误, 连正常的注册登录都没法完成, 让人觉得是不是已经没人维护, 准备抛弃了.
腾讯微云的 API 是夹杂在一堆无关的 QQ API 中间的. 最要命的是, 腾讯注册开发者需要你上传 “手持身份证” 的照片. Why? 实名登记以便跨省?
6. 115 网盘
115 曾经名声响亮. 然而, 打开 115 首页, 赫然要求只能用 115 浏览器登录, 或者用 115 手机 app 扫码才能登录. 我勒个去, 吃相也未免太太太难看了吧?
注册用户时报错 “服务器正在维护中”, 用个第三方帐号登录进去, 对网盘的页面随便做什么操作都会显示 “服务维护中” 的信息. 同样让人觉得是不是没人维护即将关闭了.
9. 千易 1000eb.net
只支持网页中嵌入上传文件到千易, 以及为上传的文件提供一个下载链接. 没有 API.
七牛的 API 比较完整. 然而它不是做网盘的, 它是做云存储服务的. 它没有面向普通用户的 web 网盘操作界面.
好象想不出来别的网盘服务了. 国内比较流行知名的面向普通用户的网盘也就这些了吧, 然而, 结果是, 没有一个能够提供方便的 API 供第三方应用使用. 这其实正是你国互联网界的一个缩影, 外表光鲜, 热闹非凡, 内里却都是破棉絮.
I have a Windows service program written many year ago and the user asked me to fix an issue that occurs recently in Windows 2008 R2. Indeed it is not a big problem but quite annoying. When the user stops the service, Windows always popup a window showing an error message like “Windows could not stop the […] service on local computer, The service did not return an error.” Damn it! How could you show me an error dialog with no error message?
Google doesn’t have any similar case like this. So I have try this and that, here and there.
OK, everybody knows that kind of experiments are boring and time consuming. So I just expose the answer.
In the service’s control handler codes for SERVICE_CONTROL_STOP, I reported a SERVICE_RUNNING status followed by a SERVICE_STOP status. That works without any problem before, but caused the issue in recent 2008 R2. After I changed the first status reporting to SERVICE_STOP_PENDING, the dialog disappears.
It looks like Windows doesn’t accept SERVICE_RUNNING when it sent to services SERVICE_CONTROL_STOP. But can you show me a clear error message?