1 建立项目
1在VS2019建立动态库
2在IntelliJ IDEA Community Edition 建立一次程序
tips:注意包名 和 类名
代码如下比较简单
package CJava;
public class NativeClass {
public native int nativeAdd(int a,int b);
public static void main(String[] args) {
System.loadLibrary("CJAVA");//注意CJAVA 就是我们建立的动态库
NativeClass a=new NativeClass();
int v=a.nativeAdd(10,20);
System.out.println(v1);
}
}
2 生成Java相关代码
根据自己的环境选择 不同的SDK 但是需要记住保持一致
这个是生成我这个类的相关C++ 头文件 如下图所示
tips:Windows 确定Java 路径命令 where java
3 回到VS2019
1 添加上面那个头文件 如图
2 加入环境
详细
3 实现函数
定义:
实现:
就是一个加法
4 最后工作
1 VS219生成模块 (tips 请注意请保持是位一致 64/32)
2 intelliJ IDEA Community Edition
确定就🆗了 其他IDA 一样的
5 运行效果
1 第一个是 刚才实现的
2 第二个是通过java 虚拟机实现
6 其他
刚才的Java 虚拟机实现函数如下
JNIEXPORT jdouble JNICALL nativefAdd
(JNIEnv*, jobject, jdouble a, jdouble b)
{
printf("%s(%d):%s a=%f b=%f\r\n", __FILE__, __LINE__, __FUNCTION__, a, b);
return a + b;
}
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM* vm, void* reserved)
{
jint result = -1;
JNIEnv* env = NULL;
if (vm->GetEnv((void**)&env, JNI_VERSION_10) != JNI_OK) //底层 虚拟机
{
printf("%s(%d):%s\r\n", __FILE__, __LINE__, __FUNCTION__);
return -1;
}
jclass clz = env->FindClass("CJava/NativeClass");//正规是.
if (clz == NULL)
{
printf("%s(%d):%s\r\n", __FILE__, __LINE__, __FUNCTION__);
return -1;
}
// double doubel doubel
JNINativeMethod methods[] = {
{(char*)"nativefAdd",(char*)"(DD)D",(void*)&nativefAdd}
};
result = env->RegisterNatives(clz, methods, sizeof(methods) / sizeof(JNINativeMethod)); //有危险 监控一个java 程序 先使用自己的 调用原来的java 也可以防御 java 可以被逆向 但是具体逻辑是看这里
if (result != 0)
{
printf("%s(%d):%s\r\n", __FILE__, __LINE__, __FUNCTION__);
return -1;
}
return JNI_VERSION_10;
}