C++写模块给Java使用

1 建立项目

1在VS2019建立动态库

C++写模块给Java使用_第1张图片
C++写模块给Java使用_第2张图片

2在IntelliJ IDEA Community Edition 建立一次程序

C++写模块给Java使用_第3张图片
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 添加上面那个头文件 如图

C++写模块给Java使用_第4张图片

2 加入环境

C++写模块给Java使用_第5张图片
详细
在这里插入图片描述

3 实现函数

定义:
C++写模块给Java使用_第6张图片
实现:
C++写模块给Java使用_第7张图片
就是一个加法

4 最后工作

1 VS219生成模块 (tips 请注意请保持是位一致 64/32)

2 intelliJ IDEA Community Edition

C++写模块给Java使用_第8张图片
C++写模块给Java使用_第9张图片
确定就了 其他IDA 一样的

5 运行效果

C++写模块给Java使用_第10张图片
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;
}

你可能感兴趣的:(通用技术,java,c++,intellij-idea,模块,VS2019)