前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Advice for Middleware Vendors JNI中间件厂商开发建议

Advice for Middleware Vendors JNI中间件厂商开发建议

作者头像
望天
发布2020-02-13 10:32:04
4950
发布2020-02-13 10:32:04
举报
文章被收录于专栏:along的开发之旅along的开发之旅

Advice for Middleware Vendors

Distributing middleware built with the NDK imposes some additional problems that app developers do not need to worry about. Prebuilt libraries impose some of their implementation choices on their users.

Choosing API levels and NDK versions

Your users cannot use a minSdkVersion lower than yours. If your users' apps need to run on Android 16, you cannot build for Android 21.

NDK versions are largely compatible with each other, but occasionally there are changes that break compatibility. If you know that all of your users are using the same version of the NDK, it's best to use the same version that they do. Otherwise, use the newest version.

Using the STL

If you're writing C++ and using the STL, your choice between libc++_shared and libc++_static affects your users if you distribute a shared library. If you distribute a shared library, you must either use libc++_shared or ensure that libc++'s symbols are not exposed by your library. The best way to do this is to explicitly declare your ABI surface with a version script (this also helps keep your implementation details private). For example, a simple arithmetic library might have the following version script:

Note: If you distribute a static library, it does not matter whether you choose a static or shared STL because nothing is linked in a static library. The user can link whichever they choose in their application. They must link something, even for C-only consumers, so be sure to document that it is required and which version of the NDK was used to build in case of incompatibility in STL versions.

代码语言:javascript
复制
LIBMYMATH {
global:
    add;
    sub;
    mul;
    div;
    # C++ symbols in an extern block will be mangled automatically. See
    # https://stackoverflow.com/a/21845178/632035 for more examples.
    extern "C++" {
        "pow(int, int)";
    }
local:
    *;
};

A version script should be the preferred option because it is the most robust way to control symbol visibility. Another, less robust option is to use

-Wl,--exclude-libs,libc++_static.a -Wl,--exclude-libs,libc++abi.a when linking. This is less robust because it will only hide the symbols in the libraries that are explicitly named, and no diagnostics are reported for libraries that are not used (a typo in the library name is not an error, and the burden is on the user to keep the library list up to date).

For Java Middleware with JNI Libraries

Java libraries that include JNI libraries (i.e. use jniLibs) need to be careful that the JNI libraries they include will not collide with other libraries in the user's app. For example, if the AAR includes libc++_shared.so, but a different version of libc++_shared.so than the app uses, only one will be installed to the APK and that may lead to unreliable behavior.

Warning: Bug 141758241: The Android Gradle Plugin does not currently diagnose this error condition. One of the identically named libraries will be arbitrarily chosen for packaging in the APK.

The most reliable solution is for Java libraries to include no more than one JNI library. All dependencies including the STL should be statically linked into the implementation library, and a version script should be used to enforce the ABI surface. For example, a Java library com.example.foo that includes the JNI library libfooimpl.so should use the following version script:

代码语言:javascript
复制
LIBFOOIMPL {
global:
    JNI_OnLoad;
local:
    *;
};

Note that this example uses registerNatives via JNI_OnLoad as described in JNI Tips to ensure that the minimal ABI surface is exposed and library load time is minimized.

https://android.googlesource.com/platform/ndk/+/refs/heads/master/docs/user/middleware_vendors.md

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Advice for Middleware Vendors
    • Choosing API levels and NDK versions
      • Using the STL
        • For Java Middleware with JNI Libraries
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档