C++给Java写程序

Posted 江州益彤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于C++给Java写程序的主要内容,如果未能解决你的问题,请参考以下文章

求帮忙写个程序 JAVA C++都行

C++程序员如何转Java

C程序如何调用C++接口?

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

如何让 C++ 程序同时做两件事?

Java程序通过JNI调用C++程序的方法