通过JNI 创建JAVA虚拟机 实现C++调用 java函数需求

核心:

1、vs项目添加库目录附加jvm.lib文件

2、vs项目添加头文件jni_md.h和jni.h

3、通过系统环境变量path设置访问jvm.dll或者通过c++代码配置访问路径

#include"jni.h"
#include"jni_md.h"
#include <stdio.h>

int main(int argc, char** argv) {
	JavaVM* vm;
	JNIEnv* env;
	JavaVMInitArgs vm_args;
	JavaVMOption options[4];
	options[0].optionString = "-Djava.compiler=NONE";
	options[1].optionString = "-Djava.class.path=E:\\Java\\workspace\\TestJNI\\out\\artifacts\\TestJNI_jar\\TestJNI.jar";
	options[2].optionString = "-Djava.library.path=D:\\Program Files (x86)\\Java\\jre1.8.0_131\\bin\\client";  //指定加载的so路径
	options[3].optionString = "-verbose:NONE"; //用于跟踪运行时的信息
	vm_args.version = JNI_VERSION_1_8;
	vm_args.ignoreUnrecognized = 1;
	vm_args.nOptions = 4;
	vm_args.options = options;
	// Construct a VM
	jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);
	// Construct a String
	jstring jstr = env->NewStringUTF("Hello World");
	// First get the class that contains the method you need to call
	jclass clazz = env->FindClass("com/my/TestJAVA");
	jmethodID newTestJavaMet= env->GetMethodID(clazz, "<init>", "()V");
	jobject testJavaObj = env->NewObject(clazz, newTestJavaMet);
	// Get the method that you want to call
	jmethodID to_lower = env->GetMethodID(clazz, "testCall", "(Ljava/lang/String;)Ljava/lang/String;");
	// Call the method on the object
	jobject result = env->CallObjectMethod(testJavaObj, to_lower, jstr);
	// Get a C-style string
	const char* str = env->GetStringUTFChars((jstring)result, NULL);
	printf("%s\n", str);
	// Clean up
	env->ReleaseStringUTFChars(jstr, str);
	// Shutdown the VM.
	vm->DestroyJavaVM();

}

java被调用模块demo代码

package com.my;

public class TestJAVA {

    public String testCall(String param){
        System.out.println(param);
        return "null";
    }

    public static void main(String[] args){

    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值