自己最近在复习Java基础, 因为学的时间不久,而且很粗糙,自己还有很多不会的知识。唉…
当看到native时,突然想要自己实现一下,然后就在网上找了一个教程,但是因为自己粗枝大叶,在这个过程中每一步都出错,因此记录下来。
- 创建一个test类文件,如下:
package com.d.test;
public class NativeTest {
public native void printInfo(String s);
public static void main(String[] args){
NativeTest t = new NativeTest();
t.printInfo("first native!");
}
}
- javac编译生成.class文件
javac NativeTest.java
如果报错找不到javac命令,那就是环境变量有问题, 可以在用户变量path添加一个java\jdk\bin的路径,因为javac.exe就在此路径下
- javah生成.h的c头文件
回到类所在包的目录下,在使用javah时需要制定类的路径,否则会报错找不到类路径,这个时候就要注意类的路径是否正确
javah classpath . com.d.test.NativeTest // .代表的是当前路径
- 使用visio studio生成动态链接文件,当然使用其他ide也可以
1) 文件- >新建->项目->动态链接库->下一步->创建,即可
2) 将刚刚生成的.h文件复制到头文件目录下,会看到红破浪线报错JNIEXPORT 和JNICALL 为声明, 这时添加两个include如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <C:\Program Files\Java\jdk1.8.0_201\include\jni.h>
/* Header for class com_hadoop_first_NativeTest */
#include <C:\Program Files\Java\jdk1.8.0_201\include\win32\jni_md.h>
#ifndef _Included_com_d_test_NativeTest
#define _Included_com_d_test_NativeTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_hadoop_first_NativeTest
* Method: printInfo
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_hadoop_first_NativeTest_printInfo
(JNIEnv*, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
3) 创建.cpp文件实现上面的方法
#include "C:\Program Files\Java\jdk1.8.0_201\include\jni.h"
#include "NativeTest.h"
#include <stdio.h>
#include <iostream>
using namespace std;
/*
* Class: HelloWorld
* Method: displayInfor
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_d_test_NativeTest_printInfo
(JNIEnv* env, jobject obj, jstring name) {
cout << << env->GetStringUTFChars(name, NULL) << endl;
}
- 此时若点击运行会发现,编译报错cpp文件“是否忘记添加 #include <pch.h>”,这个时候按要求添加进去就可以了
此时再点击运行会发现,程序依然报错“找不到jni.h文件以及jni_md.h文件"
此时需要添加”java\include" 以及“java\include\win32"两个目录到”解决方案->属性->VC+±>包含目录中“
再点击运行记=即可
5)此时在java类中添加静态代码块引入动态链接文件的路径,引入文件,并运行
static {
System.load("C:\\Users\\Deng\\Desktop\\Test\\Dll1\\x64\\Release\\Dll1.dll");
}
我的报错无法在Amd 64位的平台上运行32位的程序,这是因为我生成dll点击运行时,选择的是32位, 把他修改成64,并在添加以上包含目录就可以了
6) 运行java文件, 就会打印输出了,报错的时候一定要仔细阅读报错信息喽,多做多思考