博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JNI之c调用java全面解析
阅读量:2434 次
发布时间:2019-05-10

本文共 7014 字,大约阅读时间需要 23 分钟。

C程序调用JAVA主函数

Hello.java

ublic class Hello{    public static void main(String args[])    {    System.out.println("hello world\n");    }}

Caller.c

#include
#include
jint create_vm(JavaVM** jvm,JNIEnv** env) { JavaVMInitArgs args; JavaVMOption options[1]; args.version = JNI_VERSION_1_6; args.nOptions = 1; options[0].optionString = "-Djava.class.path=./"; args.options = options; args.ignoreUnrecognized = JNI_FALSE; return JNI_CreateJavaVM(jvm, (void **)env, &args); } int main(int argc,char **argv){ JavaVM* jvm; JNIEnv* env; jclass cls; jmethodID mid; int ret = 0; /*create java virtual machine*/ if(create_vm(&jvm,&env))//return value is not 0 is fail { printf("can not create jvm\n"); return -1; } /*get class*/ cls = (*env)->FindClass(env,"Hello"); if(cls==NULL) { printf("can not find hello class\n"); ret = -1; goto destroy; } /3*create object*/ /*call method *4.1 get method *4.2 create method *4.3 call method */ mid = (*env)->GetStaticMethodID(env,cls,"main","([Ljava/lang/String;)V"); if(mid ==NULL){ ret = -1; printf("can not get the method\n"); goto destroy; } (*env)->CallStaticVoidMethod(env,cls,mid,NULL);destroy: (*jvm)->DestroyJavaVM(jvm); return ret;}

编译java

#javac Hello.java

#javap -p -s Hello.class // get Signature

编译C
#gcc -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/ -o Caller Caller.c -L /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server -ljvm
运行程序
#LD_LIBRARY_PATH=/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server ./Caller

C程序带调用java程序的String参数int返回值的方法

Hello2.java

public class Hello2{    public static void main(String args[])    {    System.out.println("hello world\n");    }    public int Sayhello(String name)    {    System.out.println("hello,+name");    return 123;    }}

2Caller.c

#include
#include
jint create_vm(JavaVM** jvm,JNIEnv** env) { JavaVMInitArgs args; JavaVMOption options[1]; args.version = JNI_VERSION_1_6; args.nOptions = 1; options[0].optionString = "-Djava.class.path=./"; args.options = options; args.ignoreUnrecognized = JNI_FALSE; return JNI_CreateJavaVM(jvm, (void **)env, &args); } int main(int argc,char **argv){ JavaVM* jvm; JNIEnv* env; jclass cls; jmethodID mid; jmethodID cid; jobject jobj; jstring jstr; int ret = 0; int r; /*create java virtual machine*/ if(create_vm(&jvm,&env))//return value is not 0 is fail { printf("can not create jvm\n"); return -1; } /*get class*/ cls = (*env)->FindClass(env,"Hello2"); if(cls==NULL) { printf("can not find hello class\n"); ret = -1; goto destroy; } /*create object*/ /*3.1 get construct method */ /*3.2 create parameters*/ /*3.3 NewObject*/ /*Get method ID for the String construct*/ cid = (*env)->GetMethodID(env,cls,"
","()V"); if(cid==NULL) { ret = -1; printf("can not get construct method\n"); goto destroy; } jobj = (*env)->NewObject(env,cls,cid); if(jobj==NULL) { printf("can not create the object\n"); ret = -1; goto destroy; } /*call method *4.1 get method *4.2 create method *4.3 call method */ mid = (*env)->GetMethodID(env,cls,"Sayhello","(Ljava/lang/String;)I"); if(mid ==NULL){ ret = -1; printf("can not get the method\n"); goto destroy; } jstr = (*env)->NewStringUTF(env,"chnswpuiot"); r = (*env)->CallIntMethod(env,jobj,mid,jstr); printf("r is %d\n",r);destroy: (*jvm)->DestroyJavaVM(jvm); return ret;}

编译java

#javac Hello2.java

#javap -p -s Hello2.class // get Signature

编译C
#gcc -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/ -o 2Caller 2Caller.c -L /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server -ljvm
运行程序
#LD_LIBRARY_PATH=/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server ./2Caller

C程序为java程序的类设置属性

Hello3.java

public class Hello3{    private String name;    private int age;    public static void main(String args[])    {    System.out.println("hello world\n");    }    public int Sayhello(String name)    {    System.out.println("hello,"+name+"! i am is"+this.name+"! my age is"+this.age);    return 123;    }}

3Caller.c

#include
#include
jint create_vm(JavaVM** jvm,JNIEnv** env) { JavaVMInitArgs args; JavaVMOption options[1]; args.version = JNI_VERSION_1_6; args.nOptions = 1; options[0].optionString = "-Djava.class.path=./"; args.options = options; args.ignoreUnrecognized = JNI_FALSE; return JNI_CreateJavaVM(jvm, (void **)env, &args); } int main(int argc,char **argv){ JavaVM* jvm; JNIEnv* env; jclass cls; jmethodID mid; jmethodID cid; jobject jobj; jstring jstr; jfieldID nameID; jfieldID ageID; int ret = 0; int r; /*create java virtual machine*/ if(create_vm(&jvm,&env))//return value is not 0 is fail { printf("can not create jvm\n"); return -1; } /*get class*/ cls = (*env)->FindClass(env,"Hello3"); if(cls==NULL) { printf("can not find hello class\n"); ret = -1; goto destroy; } /*create object*/ /*3.1 get construct method */ /*3.2 create parameters*/ /*3.3 NewObject*/ /*Get method ID for the String construct*/ cid = (*env)->GetMethodID(env,cls,"
","()V"); if(cid==NULL) { ret = -1; printf("can not get construct method\n"); goto destroy; } jobj = (*env)->NewObject(env,cls,cid); if(jobj==NULL) { printf("can not create the object\n"); ret = -1; goto destroy; } /* *get/set filed *1.get filed id *2.get/set filed */ nameID = (*env)->GetFieldID(env,cls,"name","Ljava/lang/String;"); if(nameID==NULL) { ret = -1; printf("can not get the field name\n"); goto destroy; } jstr = (*env)->NewStringUTF(env,"chenswpu"); (*env)->SetObjectField(env,jobj,nameID,jstr); ageID = (*env)->GetFieldID(env,cls,"age","I"); if(ageID==NULL) { ret = -1; printf("cna not get field age"); goto destroy; } (*env)->SetIntField(env,jobj,ageID,10); /*call method *4.1 get method *4.2 create method *4.3 call method */ mid = (*env)->GetMethodID(env,cls,"Sayhello","(Ljava/lang/String;)I"); if(mid ==NULL){ ret = -1; printf("can not get the method\n"); goto destroy; } jstr = (*env)->NewStringUTF(env,"chnswpuiot"); r = (*env)->CallIntMethod(env,jobj,mid,jstr); printf("r is %d\n",r);destroy: (*jvm)->DestroyJavaVM(jvm); return ret;}

编译java

#javac Hello3.java
#javap -p -s Hello3.class // get Signature
编译C
#gcc -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/ -o 3Caller 3Caller.c -L /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server -ljvm
运行程序
#LD_LIBRARY_PATH=/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server ./3Caller

转载地址:http://mtomb.baihongyu.com/

你可能感兴趣的文章
linux-HA 在RHEL 6 之后的变更
查看>>
pg 中日期型的计算问题
查看>>
linux-HA 资源的failcount 问题
查看>>
pg日志分析
查看>>
求无序数组总第n大的数
查看>>
99-lisp lisp 的99个问题 P1-10
查看>>
PG 函数的易变性(Function Volatility Categories)
查看>>
Lisp Quote 和Backquote分析
查看>>
PG psql 变彩色显示
查看>>
SICP 练习 1.3
查看>>
pg 数据库HA 启动脚本的两个假设
查看>>
PG9.2.3 发布
查看>>
asm 磁盘组 增删磁盘组
查看>>
linux 系统IO 调度
查看>>
遭遇mysql 5.6.10 BUG 一例
查看>>
lisp 的逻辑计算采用短路策略
查看>>
基于linux-HA 的pg 高可用平台正式部署
查看>>
screen 的 窗口切换方式 screen 用法
查看>>
oracle logmnr 报错"In Memory Undo is unsupported"
查看>>
linux 内核 3.8 发布 ,不再支持386cpu
查看>>