java开发第三个JNI示例程序(基于linux操作系统)--Invocation Api实现native层运行java程序

在这篇博客中,我将向大家介绍如何在native层运行java程序:

主要文件就两个:

//定义一个java类,这个类将在native层被运行,写完类之后记得编译成class哟
//InvocationApiTest.java
public class InvocationApiTest
{
    public static void main(String[] args) {
        System.out.println(args[0]);
    }
}
/*由于java需要在虚拟机中运行,所以即使在C文件中运行java程序,也需要创建虚拟机,在这里调用JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args)函数创建java虚拟机,该函数在头文件jni.h中被定义,可自行查看*/
/*InvocationApi.c*/
#include <jni.h>
int main()
{
/*定义JNI入口指针*/
    JNIEnv *env;
    /*定义虚拟机指针*/
    JavaVM *vm;
    /*定义虚拟机初始化参数结构体变量*/
    JavaVMInitArgs vm_args;
    /*定义JavaVMInitArgs所指向的JavaVMOption数组*/
    JavaVMOption option[1];
    jint res;
    jclass clazz;
    jmethodID mid;
    jfieldID fid;
    jstring jstr;
    jclass strclazz;
    jobjectArray objarr;
    /*以下5行是为JavaVMInitArgs结构体中的各个参数赋值*/
    option[0].optionString = "-Djava.class.path=.";
    vm_args.version = 0x00010002;
    vm_args.nOptions = 1;
    vm_args.options = option;
    vm_args.ignoreUnrecognized = JNI_TRUE;
    /*创建虚拟机*/
    res = JNI_CreateJavaVM(&vm,(void**)&env,&vm_args);
    /*创建对InvocationApiTest的引用*/
clazz = (*env)->FindClass(env,"InvocationApiTest");
/*获取java类中main函数的ID*/
mid = (*env)->GetStaticMethodID(env,clazz,"main","([Ljava/lang/String;)V");
/*新建一个字符串*/
jstr = (*env)->NewStringUTF(env,"Hello Invocation Api");
/*创建一个对java中String类的引用*/
strclazz = (*env)->FindClass(env,"java/lang/String");
/*调用String类的NewObjectArray方法,生成一个对象数组,1代表数字中只有一个元素*/
objarr = (*env)->NewObjectArray(env,1,strclazz,jstr);
/*调用InvocationApiTest.java的main方法,即主动运行java程序*/
(*env)->CallStaticVoidMethod(env,clazz,mid,objarr);
/*释放虚拟机*/
(*vm)->DestroyJavaVM(vm);
    return 0;
}

我使用make编译C文件,即将InvocationApi.c编译为可执行文件InvocationApi,并且连接到libjvm.so,Makefile文件内容如下:

InvocationApi:InvocationApi.o
    gcc -I"${JAVA_HOME}/include" -I"${JAVA_HOME}/include/linux"       InvocationApi.c -o InvocationApi -L "/usr/local/java/jdk1.8.0_101/jre/lib/amd64/server" -ljvm
InvocationApi.o:InvocationApi.c
    gcc -c -I"${JAVA_HOME}/include" -I"${JAVA_HOME}/include/linux"  InvocationApi.c -o InvocationApi.o 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值