java调用c/c++类库(JNI技术)
1.在java项目下创建native方法
package jni;
/**
* @author jiajia
*/
public class JniTest {
public static native void printf(String str);//打印str
public static native int add(int a,int b);//return a+b
}
2.生成c/c++头文件(.h)
到项目根目录下执行命令:
javah -classpath ./bin -d ./cpp -jni jni.JniTest
此时会在项目根目录下自动创建cpp目录,里边有一个jni_JniTest.h的文件


3.创建c++项目

选择win32应用程序


选中dll,空项目

生成的目录如下

将 jdk 目录下的 jni.h 、 jni_md.h 以及之前生成的 jni_JniTest.h 放入c++项目根路径下的 include 文件夹 (include 文件夹需自己创建)

添加c++项目包含目录,将上一步创建的 include 文件夹包含进c++项目




这样就把include 文件夹包含进c++项目
接下来创建cpp文件实现头文件中的方法

创建cpp文件


注意要引入头文件
方法名称可以从头文件中复制,实现其方法即可
#include<iostream>
#include "jni_JniTest.h"
using namespace std;
JNIEXPORT void JNICALL Java_jni_JniTest_printf
(JNIEnv *env, jclass obj, jstring str){
char * t;
t = (char*)env->GetStringUTFChars(str, 0);
cout << t << endl;
}
/*
* Class: jni_JniTest
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_jni_JniTest_add
(JNIEnv *env, jclass obj, jint ia, jint ib){
return ia + ib;
}
4.生成dll文件


这样就生成成功了。生成的dll文件就放在上图的目录中
5.把生成的dll库文件放入jdk的bin目录下

6.然后编写java测试类,并运行

结果发现报错,原因是生成的dll库文件是32位的。
Exception in thread "main" java.lang.UnsatisfiedLinkError:
C:\Program Files\Java\jdk1.8.0_211\bin\JniTest.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
at 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 jni.TestMain.<clinit>(TestMain.java:5)
接下来进行设置并重新生成64位的dll库文件




设置好以后重新生成dll文件

注意此次生成的文件目录和上次不一样,在根目录下有一个/64/debug/..
将此文件覆盖之前jdk的bin目录下的dll文件。
然后重新运行java项目
package jni;
public class TestMain {
static {
System.loadLibrary("JniTest");
}
public static void main(String[] args) {
System.out.println(JniTest.add(1, 3));
JniTest.printf("hello jni");
}
}

调用成功