jni c java linux,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.cprog.c的内容为:

#include

#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!成功了,哈哈!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值