问题标签 [java-native-library]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 为什么只能在 IntelliJ 的目标/类中看到本机库?
我在 Eclipse 中有一个 OpenJFX 项目,其中有几个 Maven 项目。我有一个名为 EDSDK 的本机库,它是一个与佳能照片相机交互的库。这个库有几个 DLL,JAR 都位于项目根目录下名为“libs”的目录中。在 Eclipse 中没有问题,应用程序运行并找到库没有问题。当我想在 IntelliJ 中导入这个项目时,我遇到了两个问题。首先,路径的处理方式看起来不同。我还必须更改位于项目根目录的配置文件夹的路径。我面临的第二个问题是我在 IntelliJ 中所做的任何事情都找不到本机库(链接 inFile-> Project Structure 等)。仅当我在主应用程序中复制“libs”文件夹时才有效“...
线程“cmd-dispatcher-0”java.lang.UnsatisfiedLinkError 中的异常:无法加载库“../libs/EDSDK_64/Dll/EDSDK.dll”:本机库(win32-x86-64/../libs/EDSDK_64 /Dll/EDSDK.dll) 在资源路径中找不到 (C:\ws\PostePhotoTemp\poste-photo-ui\target\classes;C:\ws\PostePhotoTemp\poste-photo-modele\target\classes;C:\ Users\xyz01.m2\repository\net\java\dev\jna\jna\4.5.2\jna-4.5.2.jar;...(JAR 文件的长列表)
它首先尝试查看“target\classes”,然后查看一长串 JAR 文件。我做错了什么?我希望在 IntelliJ 中具有与 Eclipse 相同的行为。
编辑:我发现如果我将“libs”文件夹放在项目之外的一层,它就可以工作。
谢谢!
java - Java 中 Debian Raspberry Pi 上的蓝牙 LE
当我使用 linux 命令与 BLE 设备配对并连接时,一切正常。
现在我希望我的 java 程序读取相同的值。
我查了很多东西,所有库都基于 tinyB https://github.com/intel-iot-devkit/tinyb
我使用蓝牙管理器库https://mvnrepository.com/artifact/org.sputnikdev/bluetooth - 集成tinyB的管理器。
现在的问题:当我在我的树莓上启动 jar 时,它说:java.lang.UnsatisfiedLinkError: no javatinyb in java.library.path
解决方案应该在这里:https ://github.com/intel-iot-devkit/tinyb /issues/75
但是因为我使用 maven,所以我找不到本地库的位置以及我应该如何修改库路径。
所以我真正的问题是:如何在带有 Debian 的 Raspberry 上使用本机库?
先感谢您
java - 将 JNA Java 映射到本机 C 共享库
尝试将以下内容从 Java 代码传递到共享 C 库 .so。我对 JNA 很陌生,如果有人能指出我正确的方向,我将不胜感激。
我得到的错误是: java.lang.Error: Structure.getFieldOrder() on class com.dataTypes.TCIMUEvent does not provide enough names [0] ([]) to match declared fields [11] ([accel, accelValid,陀螺仪, gyroValid, mag, magValid, 压力, pressureValid, 温度, temperatureValid, 时间])
两个相关的对象/结构:
C 样本结构:
处理数据的 C 文件:
这是数据从 Java 传递到 C 的地方:
错误的完整跟踪是:
我觉得我对 JNA 所做的事情有点天真,所以问题在于我对我需要如何传递数据的理解,所以关于这个具体实现的一般建议肯定会帮助我理解使用 JNA 需要哪些步骤. 我已经查看了很多教程,目前正在查看其他答案。如果您需要更多信息或上下文,请给我留言。
java - 在我的手机上找不到 apk 使用的本机库
首先,对不起我的英语。这不是我的母语。这是我第一次做这样的事情,所以我在旅途中学习。
背景:我试图了解我从 Play 商店安装的游戏如何与服务器通信。更准确地说,如何在对服务器的每个 POST 请求上设置特定参数。
这个名为“secret”的 HTTP 参数不容易被逆向工程,因为它是其他参数的一种散列,用于检查请求的完整性。
我做了什么:
- 我从 .apk 中提取了 .dex 文件
- 我使用d2j-dex2jar来提取 .class 文件。
- 我用jd-gui工具分析源码
我发现了什么:这是生成“秘密”参数值的源代码:
据我所知,java 允许您使用 native 库,这要归功于native关键字。这些本机库是通过System.loadLibrary(...)
命令加载的。在 Main.java 文件中,我调用了这个命令System.loadLibrary("Main");
。如果我正确理解它是如何工作的,那么在我的安卓手机上安装了一个名为libMain.so的相应 .so 文件。
我扎根了我的 OnePlus6 并深入研究了寻找这个库的文件。
问题:我在手机上找不到这个库。/data/data// 中没有关联的 .so 文件
问题:
- 你能解释一下我做错了什么/我错过了。
- 假设我找到了库,我可以阅读其中的代码还是需要特定的工具?
- 如果问题 2 的答案是否定的,是否可以创建一个加载此特定库并使用它的小应用程序?
感谢您花时间帮助我:D
java - 如何找到在android应用程序中调用java方法的本机c++函数以及在哪个库中?
我对应用程序进行逆向工程(在开发人员的许可下),我对此仍然很陌生,但是是否可以获得调用 java 方法的本机函数的名称?在哪个图书馆?我确定正在调用本机函数,但如果我尝试使用 frida 拦截库,我会收到一条错误消息,提示 frida 无法找到我使用 jd-gui 反编译 apk 的库,我无法在 libs 文件夹中找到库试图拦截 System.loadLibrary() 但应用程序因地址无效错误而崩溃但我确实发现应用程序正在加载一个库有没有办法在java中指定本机库路径?以及应用程序如何加载库但 frida 看不到它们?
apache-spark - spark.driver.extraLibraryPath 覆盖原始库路径
我有一个在 AWS EMR 集群上运行的 spark 作业,它需要访问本机 lib(*.so),每个 spark 的文档 ( https://spark.apache.org/docs/2.3.0/configuration.html ) 我需要添加“ spark-submit 命令行中的 spark.driver.extraLibraryPath" 和 "spark.executor.extraLibraryPath" 选项
它按我的预期工作,加载了本地库,问题是:在火花作业期间,我需要执行需要 lzo 本地库的分布式 lzo 索引器 MR 作业,lzo 代码无法加载本地 gpl 库:
似乎“spark.driver.extraLibraryPath”选项覆盖或更改整个库路径而不是附加一个新路径,我怎样才能同时保留 gpl lzo 本机路径和我自己的库路径?
java - JNI: SIGSEGV when calling native function from Java, after native registration of same function on library second opening
I have an Android app that is structured in the following way:
- CORE: Is the class of the accessibility service that dinamically loads a few dex files. It will be loaded when app starts;
- MODULE: Is the classe created by loading relative dex file
Actions
- When Core starts, in onServiceConnected, this service loads a native library libbridge.so.
- libbridge.so exposes two methods:
- openLib(module):
- this method opens the library libcloser.so first time and libcloser_2.so second time. These two libs are equals, only names are different.
- registers a function called doSum of libcloser.so / libsloser_2.so by using RegisterNatives JNI function, to the module received in input.
- closeLib(module): Unregisters the function doSum for the module received in input and closes the libcloser.so / libsloser_2.so lib
- openLib(module):
Core exposes two methods:
- onOpenLib(module): Calls libbridge.so method openLib(module)
- onCloseLib(module): Calls libbridge.so method closeLib(module)
From the Module, dinamically loaded from a dex, in doSumInLib function (called from constructor), Core openLib(module) is called, passing this:
Core.onOpenLib(this)
- libbridge.so openLib(module) is called;
- libcloser.so is opened, and an handle is returned;
- the function doSum is registered (with the same handle);
When Module call function doSum(), libcloser.so is called and executes code successfully.
With certain conditions, Core terminates the Module thread.
- Core onCloseLib(module) is called;
- libbridge.so closeLib(module) is called;
- function are unregistered (with the same handle);
- libcloser.so is closed (by the same handle);
After some time, Core reloads the Module from the dex file and tries to execute the same actions writed before (Back to 3). Now the lib that will be opened is libcloser_2.so.
At this time, when point 3 is executed again, when Module call libcloser_2.so doSum(), JNI crash and return this stack:
FYI
- 0x72f74536b8 is the memory address of the function gotten from libcloser.so with dlsym()
SO, JNI crash on doSum calling of libcloser_2.so and the address memory that generates exception is the handle of doSum of libcloser.so opened and closed before opening libcloser_2.so
Anyone can help me?
python - 是否可以使用 python 在纯 Java 中制作本机?
使用 JNI 或Java Native Interface,可以在 Java 中使用 c++/c 类型和函数。我想用 Python 做类似的事情。有许多用于从 Java 执行 Python 代码的库,例如 Jython,但我不想使用任何库。
从技术上讲,dll文件只是编译后的机器代码,所以如果 c/c++ 可以编译成它,那么 Python 也可以。是否可以使用 Java 的内置本机接口从 Python 中使用类型和函数?这是我要完成的示例:
在 Python 中:(一个名为 的文件hello.py
)
生成的DLL文件将是hello.dll
然后这将是 Java 中的代码:(在一个名为 的文件中hello.java
)
java - 如何在 gradlew installDist 中设置 java.library.path
我正在学习使用库的 JNI,教程是https://www.baeldung.com/jni。java源文件是
项目目录是:
build.gradle 文件是
和 settings.gradle 是
当我运行时./gradlew installDist
,它工作正常,并提供以下目录结构
但是当我跑的时候build/install/jni/bin/jni
,我给了我
我不明白为什么,如何在命令中包含 java.library.pathgradlew installDist
java - 使用 Java 反射加载 Android Native 库
我正在尝试使用 Java 反射加载一个 Android 本机库,但在运行时找不到该库。通常我加载一个本机库:
一切都按预期工作。现在我尝试loadLibrary
用反射调用该方法,如下所示:
但在运行时我得到:
似乎通过反射loadLibrary
在错误的路径中查找库。这些/system/lib64:/vendor/lib64
是java.library.path
属性的路径,但它不会在 apk 内部查看。当然,该库存在于最终的 apk 中,并且位于正确的位置,用于正确的 ABI。
笔记
我无法使用
因为从我打电话的地方我没有可用的路径,我没有任何Context
或Application
可用的路径来检索路径。
你知道如何强制loadLibrary
搜索当前的 apk 吗?谢谢!