C++给Java写程序

创建一个Java项目,编码选择utf8
在这里插入图片描述
编译Java文件生成.h文件
在这里插入图片描述
在这里插入图片描述
将.h文件拷贝到C++项目中
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
实现方法
在这里插入图片描述
编译生成解决方案,并复制路径E:\VS2017\edoyun\x64\Release
在这里插入图片描述

在这里插入图片描述
运行输入结果
在这里插入图片描述
进阶:实现手动注册一个实现的方法
在这里插入图片描述
在这里插入图片描述
完整代码如下:

package eDoYun;

public class NativeClass {
	public native int nativeAdd(int a, int b);

	public native double nativefAdd(double a, double b);

	public static void main(String[] args) {
		System.loadLibrary("edoyun");// 要生成的C++模块

		NativeClass a = new NativeClass();

		a.nativeAdd(10, 20);

		a.nativefAdd(1.234, 2.345);
	}
}

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include"eDoYun_NativeClass.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

//实现方式1:通过命名规则绑定
JNIEXPORT jint JNICALL Java_eDoYun_NativeClass_nativeAdd
(JNIEnv *, jobject, jint a, jint b) {
	//打印日志和a,b的值
	printf("%s(%d):%s a=%d b=%d\r\n", __FILE__, __LINE__, __FUNCTION__, a, b);
	return a + b;
}

//实现方式2:手动注册方法绑定
JNIEXPORT jdouble JNICALL nativefAdd
(JNIEnv *, jobject, jdouble a, jdouble b) {
	//打印日志和a,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_1_1) != JNI_OK) {
		printf("%s(%d):%s\r\n", __FILE__, __LINE__, __FUNCTION__);
	}
	jclass clz = env->FindClass("eDoYun/NativeClass");
	if (clz == NULL) {
		printf("%s(%d):%s\r\n", __FILE__, __LINE__, __FUNCTION__);
		return -1;
	}

	JNINativeMethod methods[] = {
		{(char*)"nativefAdd",(char*)"(DD)D",(void*)&nativefAdd}//"(DD)D"两个参数都是double返回值也是double
	};

	//注册
	result = env->RegisterNatives(clz, methods, sizeof(methods) / sizeof(JNINativeMethod));
	if (result != 0) {
		printf("%s(%d):%s\r\n", __FILE__, __LINE__, __FUNCTION__);
		return -1;
	}

	return JNI_VERSION_1_1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值