JNI学习笔记

 JNI学习笔记

C调用JAVA

1 编写JAVA类

public class Welcome {
    public static void main(String[] args) {
        String[] greeting = new String[3];
        greeting[0] = "Welcome to Core Java";
        greeting[1] = "by Cay Horsmann";
        greeting[2] = "and Gary Cornell";

        for (String g: greeting)
            System.out.println(g);
    }
}

2 JAVAC编译Welcome.java生成Welcome.class

3 编写C程序NativeCall.c

// Native Call.c : Defines the entry point for the console application.

#include <jni.h>
#include <stdlib.h>


int main()
{
    JavaVMOption options[1];
    JavaVMInitArgs vm_args;
    JavaVM *jvm;
    JNIEnv *env;
    long status;
    
    jclass class_Welcome;
    jclass class_String;
    jobjectArray args;
    jmethodID id_main;
    
    /*JNI 调试信息开关*/  
    /*options[0].optionString="-verbose:jni";
    options[1].optionString = "-Djava.class.path=.";*/
    options[0].optionString = "-Djava.class.path=.";//设置运行环境,指示Class文件在当前目录下
    memset(&vm_args, 0, sizeof(vm_args));
    vm_args.version = JNI_VERSION_1_6;
    vm_args.nOptions = 1;
    vm_args.options = options;
    status = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
    printf("%d/n", status);
    if (status == JNI_ERR) {
        printf("Error creating VM/n");
        return 1;
    }

    //main logic
    class_Welcome = (*env)->FindClass(env, "Welcome");
    id_main =
        (*env)->GetStaticMethodID(env, class_Welcome, "main", "([Ljava/lang/String;)V");
    /*
        ([Ljava/lang/String;)V 为main函数的方法签名,可以通过用于看*.class文件的反汇编命令javap -s -c Welcome
        得到该方法的签名Signature
    */

    class_String = (*env)->FindClass(env, "java/lang/String");
    args = (*env)->NewObjectArray(env, 0, class_String, NULL);
    (*env)->CallStaticVoidMethod(env, class_Welcome, id_main, args);
    //main logic finished
    
    (*jvm)->DestroyJavaVM(jvm);

    return 0;
}

4 在当前目录下运行命令:cl -I C:/Java/jdk1.6.0/include -I C:/Java/jdk1.6.0/include/win32 NativeCall.c C:/Java/jdk1.6.0/lib/jvm.lib
成功后生成NativeCall.exe,命令行中运行该exe文件得到执行结果.

(以上程序都是在同一个文件夹中进行的)

如果采用VC编程环境,需要在IDE中设置头文件jni.h所在的目录,Tools---Options---Directories在拉框Show directory for...中
    选择Include files加入C:/Java/jdk1.6.0/include;C:/Java/jdk1.6.0/include/win32(主要是需要jni.h,jni_md.h)
    选择Libiary files加入C:/Java/jdk1.6.0/lib(主要需要jvm.lib)




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值