Java 8之前的Java版本要求本机代码必须位于共享库中,但是我已经读到Java 8可以在JNI中使用静态链接库。我已经搜索了示例,但找不到任何示例。
如何将JNI库静态链接到Java应用程序?
Java SE
8规范已更改为支持静态链接,并且静态链接在JDK中实现。在System.loadLibrary的规范中对此进行了简要介绍。它所引用的JNI规范的各个部分在此处和此处。
静态和动态链接方法的本机方法签名和数据类型相同。不过,您可能必须破解JDK makefile才能使其静态链接您的库。
一个重大区别是静态库的初始化方式。动态库通过调用JNI_OnLoad
函数进行初始化,并通过调用进行初始化JNI_OnUnload
。每个动态库都可以具有自己的这些功能的版本。如果有多个静态链接库,显然它们不能全部具有相同名称的函数。对于名为libname
的静态库,加载/卸载函数为JNI_OnLoad_libname
和JNI_OnUnload_libname
。
该JNI_OnLoad_libname
函数必须返回一个JNI_VERSION_1_8
或更高的值。如果不是,则JVM将忽略静态库。
基本上,如果调用System.loadLibrary("foo")
,系统将JNI_OnLoad_foo
在运行的可执行映像中查找该函数,如果找到该函数,则假定该库是静态链接的,并且在运行的映像中搜索其本机方法。如果JNI_OnLoad_foo
未找到,则进行动态库的常规搜索和加载,并从找到的动态库中链接本机方法。
问题内容: 是否可以构建一个HelloWorld.lib并使用JNI将其加载到Java应用程序中?还是仅适用于共享库? 我在JNI文档中找不到明确的答案,没有引用“静态库”。 问题答案: 它必须是一个动态库。幸运的是,您可以从静态库中构建一个动态库。
出于安全考虑,我希望静态链接所有库,包括包含JNI\u OnLoad函数的本机库。我已经读到可以静态链接JNI库(http://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/invocation.html#library_version)但我用Android Studio做不到。有可能吗? 这是我目前拥有的。 在Java代码中: 在
使用clang链接AFN .a静态库 AFN静态库的生成不是重点, 以链接使用为主 一、准备 在staticLib文件夹下新建test.m文件, 代码如下 #import <Foundation/Foundation.h> #import <AFNetworking.h> int main() { AFHTTPSessionManager *manager = [AFHTTPSe
主要内容:静态链接库,动态链接库,总结我们知道,C、C++程序从源文件到生成可执行文件需经历 4 个阶段,分别为预处理、编译、汇编和链接,本节将重点围绕链接阶段,对静态链接库和动态链接库做详细的讲解。 有关链接操作的具体细节,感兴趣的读者可阅读《 到底什么是链接,它起到了什么作用?》和《 符号——链接的粘合剂》这两节。总的来说链接阶段要完成的工作,就是将同一项目中各源文件生成的目标文件以及程序中用到的库文件整合为一个可执行文件。 通过
问题内容: 在Linux上的“ C”上, 我需要静态库来静态链接,还是需要足够的共享库?如果没有,为什么不呢?(它们不包含相同的数据吗?) 问题答案: 是的,您需要静态库来构建静态链接的可执行文件。 静态库是编译对象的捆绑包。静态链接到库时,实际上与获取该库的编译结果,将它们解压缩到当前项目中以及将它们当作自己的对象使用一样。 动态库已链接。这意味着一些信息,例如重定位,已经被修复并丢弃。 此外,
问题内容: 我正在编写一个与GNU GPL不兼容的跨平台应用程序。我当前面临的主要问题是该应用程序与glibc和libstdc ++动态链接,并且几乎所有对库的新更新都不向后兼容。因此,在我的应用程序中会看到随机崩溃。 解决方法是,将应用程序的二进制文件分发在几个不同的系统(具有不同的C / C 运行时版本)上编译。但我要没有这个。所以我的问题是,请牢记许可和所有注意事项,我可以静态链接glibc