jni在linux C中创建java虚拟机

一、我的示例的环境说明:

(1)带有gcc Linux系统 Red Hat

(2)已经装有jdk1.6.0_25, 安装路径为: /root/cppDev/jdk1.6.0_25

二、实现步骤

[root@localhost ~]# pwd
/root
[root@localhost ~]# mkdir createJavaVM
[root@localhost ~]# cd createJavaVM/

[root@localhost createJavaVM]# touch Prog.java

[root@localhost createJavaVM]# vim Prog.java 

Prog.java的内容为:

public class Prog {
  public static void main(String[] args) {
    System.out.println("Hello World " + args[0]);
  }
}
[root@localhost createJavaVM]# javac Prog.java
[root@localhost createJavaVM]# touch prog.c
[root@localhost createJavaVM]# vim prog.c
prog.c的内容为:

#include <jni.h>
#define PATH_SEPARATOR ';' /* define it to be ':' on Solaris */
#define USER_CLASSPATH "." /* where Prog.class is */
main() {
    JNIEnv *env;
    JavaVM *jvm;
    jint res;
    jclass cls;
    jmethodID mid;
    jstring jstr;
    jclass stringClass;
    jobjectArray args;
#ifdef JNI_VERSION_1_2
    JavaVMInitArgs vm_args;
    JavaVMOption options[1];
    options[0].optionString =
        "-Djava.class.path=" USER_CLASSPATH;
    vm_args.version = 0x00010002;
    vm_args.options = options;
    vm_args.nOptions = 1;
    vm_args.ignoreUnrecognized = JNI_TRUE;
 /* Create the Java VM */
    res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
#else
    JDK1_1InitArgs vm_args;
    char classpath[1024];
    vm_args.version = 0x00010001;
    JNI_GetDefaultJavaVMInitArgs(&vm_args);
    /* Append USER_CLASSPATH to the default system class path */
    sprintf(classpath, "%s%c%s",
            vm_args.classpath, PATH_SEPARATOR, USER_CLASSPATH);
    vm_args.classpath = classpath;
    /* Create the Java VM */
    res = JNI_CreateJavaVM(&jvm, &env, &vm_args);
#endif /* JNI_VERSION_1_2 */
    if (res < 0) {
        fprintf(stderr, "Can't create Java VM\n");
        exit(1);
    }
    cls = (*env)->FindClass(env, "Prog");
    if (cls == NULL) {
        goto destroy;
    }
    mid = (*env)->GetStaticMethodID(env, cls, "main",
            "([Ljava/lang/String;)V");
    if (mid == NULL) {
        goto destroy;
    }
    jstr = (*env)->NewStringUTF(env, " from C!");
    if (jstr == NULL) {
        goto destroy;
    }
    stringClass = (*env)->FindClass(env, "java/lang/String");
    args = (*env)->NewObjectArray(env, 1, stringClass, jstr);
    if (args == NULL) {
        goto destroy;
    }
    (*env)->CallStaticVoidMethod(env, cls, mid, args);
destroy:
    if ((*env)->ExceptionOccurred(env)) {
        (*env)->ExceptionDescribe(env);
    }
    (*jvm)->DestroyJavaVM(jvm);
}

编译prog.c 为 可执行的test文件

下面的命令中 “/root/cppDev/jdk1.6.0_25/jre/lib/i386/server” 是动态库libjvm.so所在的目录

[root@localhost createJavaVM]# gcc prog.c -o test -I /root/cppDev/jdk1.6.0_25/include/ -I /root/cppDev/jdk1.6.0_25/include/linux/

-I /root/cppDev/jdk1.6.0_25/jre/lib/i386/server/ -L /root/cppDev/jdk1.6.0_25/jre/lib/i386/server/ -ljvm

上面命令执行后显示的结果为:

prog.c: In function ‘main’:
prog.c:38: 警告:隐式声明与内建函数 ‘exit’ 不兼容

ls查看到已经生成了test文件

[root@localhost createJavaVM]# ls
prog.c  Prog.class  Prog.java  test

设置环境变量

[root@localhost createJavaVM]# export LD_LIBRARY_PATH=/root/cppDev/jdk1.6.0_25/jre/lib/i386/server/

查看环境变量的设置

[root@localhost createJavaVM]# echo $LD_LIBRARY_PATH

/root/cppDev/jdk1.6.0_25/jre/lib/i386/server/

执行test文件可以看到打印结果Hello World from C! 

[root@localhost createJavaVM]# ./test
Hello World  from C!
成功了,哈哈!

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值