- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要构建一个 DLL,然后可以从 java 程序中加载 JNI。去年我能够做到这一点,而且效果很好。我现在正在尝试重新编译我的同一个 .cpp 文件,尽管我使用它制作了 dll,但由于引入了包含的 dll 依赖项,它失败了。
我有一个 c++ 程序,它从这里的一些现有 C++ 代码中调用大约 5 个函数。这些函数是一个巨大的代码库的一部分,这些代码库通常都链接在一起以构建一组 5 个 dll。
我使用dependency walker来查看我的dll,去年它编译时只有2个依赖系统dll被放入我的dll中。今天我试图重新编译相同的 dll,但如果我从包含我使用的函数的现有代码库中链接到 .lib 文件,它会带来第三个 dll 文件。
基本上我知道如果我可以避免第三个 dll 出现在我的程序中,我的 dll 将与 JNI 一起正常工作。问题是我不知道如何在不链接到 lib 文件的情况下从我们现有的代码库中引用我的代码中需要的函数。
我可以让它与标准的 c++ 文件和方法一起工作。只有当我从我们庞大的代码库中引用这个预先存在的代码时,才会出现这个问题。
如果我没有将我的 .obj 文件与我们代码中的 .lib 文件链接,我会从我必须使用的 Borland 5.5 编译器中获得未解析的引用消息。
总体问题是当我从 c++ exe 文件调用它时,我的 dll 文件工作正常,但 Java 无法处理其中的某些内容。此外,如果我将代码编译成 unix 中的 .so 文件而不是 windows dll,Java JNI 可以正常工作并且可以加载它。我知道这个问题与 Windows 如何使用 dll 有关,而且我知道如果这个 3rd dll 没有作为我的 dll 的一部分加载它也可以工作。我只是不知道我去年做了什么来构建我的 dll 而没有将第三个显示为依赖项。
如果我从我们现有的代码中注释掉函数,它可以很好地编译并加载,因为第三个 dll 依赖项没有放入我的 dll 中。
更多细节
我收到一条关于缺少 _strcopy 的消息,因此我在 cw32mti.lib 文件中进行了链接,但它消失了,但随后 cw32mti.dll 出现在我的 dll 文件中。如何防止缺少类似的引用消息并防止它将 dll 放入我的 dll 中?
我的链接命令如下所示。
ilink32 mydll.obj, mydll.dll,,cw32mti
我让其他缺少的引用工作的唯一方法是将其他 dll 添加到我的链接命令中,例如:
ilink32 mydll.obj, mydll.dll,,cw32mti.lib other.lib
other.dll 包含我从 mydll.dll 调用的函数,例如calculate(int a, int b),所以我的代码有一个链接,比如calculate(num1, num2);问题是当我使用包含计算方法的库时,它还引入了链接到我不想加载的 other.dll 的其他 dll。我需要能够在不将 other.dll 添加到 mydll.dll 的情况下调用 calculate(num1, num2)。这在没有动态调用计算和使用 getprocaddress 类型的编码之前工作。
更新 - 我最终不得不放弃让 windows dll 与 smartheap 内存管理器一起工作。由于此代码是在 unix 中部署的,因此我能够构建 .so 文件并让它们与 JNI 一起使用。对于 Windows dll 编译,我在导致 smartheap dll 被加载的 JNI 代码周围放置了一些条件编译器语句,因此当它在 Windows 中编译时它不使用该代码。相反,我只是让它打印出一条声明,说它没有在 Windows 中执行。
我们后来也遇到了让我们的 64 位 JBoss 服务器运行和加载这些 32 位 .so 文件的问题。我最终在 64 位服务器旁边运行了一个并行 JBoss 服务器,并调用了在 32 位 JBoss 实例上引用 32 位库的方法。
它可能会在以后演变成更多,但现在这项任务在我们尝试了许多不同的事情几个月后正在为我们工作。我感谢这里的所有帮助和输入。
最佳答案
如果您可以使用去年构建的应用程序 DLL,请使用 TDUMP
查看模块依赖项是什么。 (您可能必须分析所有的 DLL 以获得良好的图像。)然后努力在新的 DLL 中重现它,可能通过调整链接器的配置 .DEF
文件。
如果您的问题中没有显示任何代码或 .DEF 文件,很难更具体。
关于c++ - 需要帮助为 JNI 调用构建 DLL。 Unresolved external 引用。 Borland 编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9960806/
我刚开始使用 JNI,但遇到以下问题。 我有一个包含简单类的 C++ 库。我从 Java Android 项目中调用了三个 JNI 方法,分别实例化所述类、调用实例化类的方法并销毁它。我保留了对该对象
背景 我有一个 android 项目,它使用 JNI(使用 NDK)以 Java 和 C/C++ 进行编码。 我在java端创建了一个Jni java包装器,它将自己完成所有Jni操作,而除了这个包装
我想传递一个java对象的地址,JNI方法应该填充所传递对象的字段。1. java代码传递给定的对象引用。 JNI 方法应该能够缓存这个对象。这是一次性通话。2. 然后,java 对象使用不同的参数重
我本质上是在尝试遵循描述的 SO 解决方案 here , 但我遇到了问题。 这基本上就是我在 JNI 库中所做的事情: handle = dlopen("/data/data/lib/my.packa
我试图实现某种异常处理 一开始我打电话 jni::ExceptionDescribe() 之后我使用了的实现 How to obtain a description of a Java excepti
是否可以从不同 jni 库的另一个方法调用 1 个库的 jni 方法?例如:我有 2 个库 lib_1.so 和 lib_2.so。 我想从 lib_2.so 调用 lib_1.so 的方法 get_
我想在native方法中使用动态注册,所以我需要设置JNI_onLoad功能。我只是写了一个函数来获取两个数字的总和。但是,它无法正确构建。我该如何更正错误? 这是我的 *.cpp 文件,我将此文件命
我已经为 C 头文件制作了一个 make 文件,它工作正常,但是说 JNICALL 和 JNIEnv 存在语法错误,但我已经弄明白了这是因为头文件中的类型。 Image of the failure
我需要实现一个本地方法,比方说“public native void someFunc();”。我有两个库,libabc.so 和 libdef.so。 Java 使用 System.loadLibr
背景 我正在 eclipse 中为 android 开发一个应用程序,现在我遇到了一个问题,我需要你的帮助。所以我必须从 JAVA 应用程序调用用 C 编写的函数。但是在我编写代码的过程中,我有一些问
我正在使用 Android 上的 Java native 接口(interface)将当前 Activity 传递给 native 方法。但我没有使用类似 JNI 的函数名称来执行此操作。我正在手动注
我正在使用 JNI,我想知道是否可以通过 delegate 进行通信。 例如: Kotlin typealias MessageReceived = (msg: String) -> Unit ext
看来我对 JNI 的运气并不好。我正在等待我买的书到货,但现在是试错法。 我正在使用 JNI 来实现 Lua 求值器。 evaluatorNew() 只是创建一个新的 Evaluator() 对象,创
我有下面的代码,我想调用在同一个源文件中实现的函数,在本例中使用 C 语言: JNIEXPORT jstring JNICALL MyClass_get_1Uname__C (JNIEnv *env,
硬件手机和平板电脑内存太少,但 HAXM 工作正常? 我的基本问题是我的应用程序(很可能是我的 Java 应用程序加载的 JNI 动态库)太大。如果未使用硬件电话和模板调用 JNI 指令,Java 应
我正面临崩溃 JNI WARNING : 0x44f81e80 is not a valid JNI reference, in Ldalvik/system/NativeStart;. run()v
我移植了很多数学知识。我正在使用 over to c++ from java 并看到这样做有很大的性能提升,但我无法弄清楚要使用什么 jni 函数来摆脱我不再需要的变量。例如,我知道当您的 jni 方
我正在使用 JNI 调用一个静态 java 方法,该方法又创建一个 Swing JFrame 并显示它。代码相当简单,Java 代码独立运行(即 java StartAWT 做它应该做的事),而当使用
我正在尝试创建一个新线程,因此我将 VM 从我的方法初始化(从 Java 调用)传递到我的新线程。在线程中,我调用 AttachCurrentThread 并获取 JNIEnv* env。 稍后,我尝
我想知道是否有可能从java调用C++方法。 我非常希望能够从 java 读取内存进程。 我懂c++,但我想使用像java这样的更高级别,但仍然能够侵入进程内存。 有什么线索吗? []的 最佳答案 这
我是一名优秀的程序员,十分优秀!