linux c 调用java_linux C 调用JAVA的参数、方法

如何运行这个例子:

1.  执行命令 "javac CJava.java" 编译 java代码。

2.  添加头文件目录 JAVA_HOME/include

3.  添加库文件 JAVA_HOME/jre/lib/i386/server

4.  添加 JAVA_HOME/jre/lib/i386/server/libjvm.so (jvm动态库)

5.  编译和执行CJava.c程序。

注意:

1.你必须安装JDK 1.6和配置java的JAVA_HOME环境变量和路径。

2.exec命令”javap - s - p CJava”查看签名的方法。

CJava.java:

//package jni;

public class CJava {

public static String getstring(String str){

return str + " ---> added";

}

public static int add(int a, int b) {

return a + b;

}

public int sub(int a, int b) {

return a - b;

}

public static void main(String[] args) {

System.out.println("Hello world!");

}

}

CJava.c:

#include

#include

#include

int main()

{

JavaVMOption options[1];

JNIEnv *env;

JavaVM *jvm;

JavaVMInitArgs vm_args;

long status;

jclass cls;

jmethodID mid;

char* class_name="CJava";

options[0].optionString = "-Djava.class.path=.";

vm_args.version = JNI_VERSION_1_6;

vm_args.nOptions = 1;

vm_args.options = options;

vm_args.ignoreUnrecognized = JNI_TRUE;

/* 创建 Java VM */

status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

if (status < 0 || status == JNI_ERR) {

printf("Status of creating Java VM:%d\n",status);

fprintf(stderr, "Failed to create Java VM!\n");

return 1;

}

/*查找java类*/

cls = (*env)->FindClass(env, class_name);

if(cls !=0)

{

/*测试调用静态方法*/

char* static_method_name="add";

char* static_method_sign="(II)I";

/*获取方法ID*/

mid = (*env)->GetStaticMethodID(env, cls, static_method_name, static_method_sign);

if(mid !=0)

{

/*调用静态方法*/

jint result = (*env)->CallStaticIntMethod(env, cls, mid, 5,1);

printf("Call static method %s: %d\n",static_method_name,result);

}else{

printf("Failed to find method %s!\n",static_method_name);

}

/*测试调用类的方法*/

char* instance_method_name="sub";

char* instance_method_sign="(II)I";

jmethodID constructor_mid = (*env)->GetMethodID(env,cls,"","()V"); //The construcotr method name is

jobject jobj = (*env)->NewObject(env,cls,constructor_mid);

/*获取方法ID*/

mid = (*env)->GetMethodID(env,cls,instance_method_name,instance_method_sign);

if(mid !=0)

{

/*调用方法*/

jint result = (*env)->CallIntMethod(env, jobj, mid, 9,4);

printf("Call instance method %s: %d\n",instance_method_name,result);

}else{

printf("Failed to find method %s!\n",instance_method_name);

}

}else{

printf("Failed to find Class %s!\n",class_name);

}

/*销毁 JVM*/

(*jvm)->DestroyJavaVM(jvm);

return 0;

}

编译java代码:

javac CJava.java

编译C程序:

gcc -o cjava -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -L$JAVA_HOME/bin -L$JAVA_HOME/jre/lib/i386/server CJava.c -ljvm

执行:

./cjava

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值