栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++写模块给Java使用

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++写模块给Java使用

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=%frn", __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):%srn", __FILE__, __LINE__, __FUNCTION__);
		return -1;
	}

	jclass clz = env->FindClass("CJava/NativeClass");//正规是.
	if (clz == NULL)
	{
		printf("%s(%d):%srn", __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):%srn", __FILE__, __LINE__, __FUNCTION__);
		return -1;
	}
	return JNI_VERSION_10;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/767441.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号