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写程序的主要内容,如果未能解决你的问题,请参考以下文章
对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段