使用 x86_64-w64-mingw32-g++ 编译 JNI C++本机代码
Compiling JNI C++ Native Code with x86_64-w64-mingw32-g++
我想编译并运行一个简单的 Hello World 程序,该程序声明并调用来自 Java 的本机打印方法(在 C++ 中定义(。
你好CPP.java
class HelloCPP{
private native void print();
public static void main(String [] args){
new HelloCPP().print();
}
static{
System.loadLibrary("HelloCPP");
}
}
你好CPP.cpp
#include <jni.h>
#include<iostream>
#include "HelloCPP.h"
using namespace std;
extern "C"
JNIEXPORT void JNICALL Java_HelloCPP_print(JNIEnv *env, jobject obj){
cout << "Hello World from C++!" << endl;
return;
}
在命令提示符下,我运行以下命令:
- javac 你好CPP.java
- javah -jni HelloCPP
- 86_64-w64-mingw32-g++ -c -I"C:\Java\jdk1.8.0_171\include" -I"C:\Java\jdk1.8.0_171\include\win32" 你好CPP.cpp
- x86_64-w64-mingw32-g++ -shared -o 你好CPP.dll 你好CPP.o
- java -Djava.library.path=.你好CPP
然后臭名昭著的DLL链接/加载错误
线程 "main" java.lang.UnsatisfiedLinkError:<"MyProjectDirectory">\HelloCPP.dll: 无法在 java.lang.ClassLoader$NativeLibrary.load(Native Method( at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941( at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857( at java.lang.Runtime.loadLibrary0(Runtime.java:870( at java.lang.System.loadLibrary(System.java:1122( at HelloCPP.(你好CPP.java:8(
尝试的解决方案
- java -Djava.library.path=.HelloCPP 应该检查当前项目目录,这是构建 dll 的地方,应该链接正常
- 已尝试将 dll 复制到另一个文件夹,并将该文件夹目录添加到路径系统环境变量
- 使用依赖沃克并注意到HelloCPP.dll正在寻找libstdc++-6.dll和其他dll。
- 尝试将这些驱动程序复制到同一目录中,然后引起连锁反应,寻找其他dlls
- 尝试添加命令,如 -static-libstdc++
附加说明
- 我可以使用 C 中的本机方法运行这个确切的程序,并使用 x86_64-w64-mingw32-gcc,找到、链接、加载 DLL 并且程序运行良好
- x86_64-w64-mingw32-g++通过Cygwin下载
- 切换到 x86_64-w64-mingw32-g++,因为我遇到了与 Cygwin 编译错误相同的问题 有问题的帧:# C [cygwin1.dll+0xd6d47] 使用 g++ 时使用 JNI
- 目前正在使用Sublime文本编辑器编写我的Java和C++文件,然后通过命令提示符进行编译
- 如果有人能向我推荐一个好的IDE来用于JNI的开发,那就太好了
- 第一次发帖希望没有错过任何重要的事情,花了很多时间浏览已经问过的问题
Java Code: 你好世界.java
class helloworld{
public native void hello();
static {
System.loadLibrary("hello");
}
public static void main(String args[]){
new Helloworld().hello();
}
}
CPP 代码: 你好.cpp
#include<iostream>
#include "helloworld.h"
using namespace std;
JNIEXPORT void JNICALL Java_helloworld_hello(JNIEnv *env, jobject obj)
{
cout<<"Hello World";
return;
}
命令
javac -h . helloworld.java
g++ -I /usr/lib/jvm/java-8-oracle/include/ -I /usr/lib/jvm/java-8-oracle/include/linux/ hello.cpp -shared -o libhello.so -fPIC
java -Djava.library.path=. helloworld
相关文章:
- 通过JNI传递数据数组的最快方法是什么
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 将 C# DLL 导入 C++ 以用于 JNI
- 用C++包装 Java 库 (JNI)
- 如何通过 JNI 将 C 字符串表情符号传递给 Java
- JNI从Android调用C++方法
- JVM 如何执行 JNI
- React Native (Android):无法通过 JNI 在 jobject 中返回字符串
- 如何将字符串数组返回到 java JNI
- JNI 日期值转换问题,在C++中获取不同的长整型值
- JNI,使用两个 .so 文件时出错,其中一个文件需要另一个文件
- Winapi - SetWindowLongPtr in ShutdownBlockReason创建/销毁JNI本机代码
- 将预编译的 C 共享库与 JNI/NDK 结合使用
- JNI 在应用程序中检测到错误:在为 innerclass 调用 NewObject 时使用了无效的 jobject
- 使用 jni 将返回带有模板的对象的 Java 代码转换为 c++
- 无法将DefineClass(JNI)与Qt资源一起使用
- 使用本机 JNI 静态方法实现C++ Java 运行时错误
- 从C++调用dll实现的JNI
- 如何在JNI中从线程内部调用JAVA方法
- 如何从 C/C++ 在 JNI for Java 中创建 UTF16 字符串?