核心:
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){
}
}