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 <stdio.h>
#include <jni.h>
#include <stdarg.h>

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);
        }
        /*测试调用<span style="color: rgb(51, 51, 51); font-family: Arial; line-height: 26px;">类的方法</span>*/
        char* instance_method_name="sub";
        char* instance_method_sign="(II)I";

        jmethodID constructor_mid = (*env)->GetMethodID(env,cls,"<init>","()V"); //The construcotr method name is <init>
        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


转载原文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值