美文网首页
Jni 学习之路--入门尝鲜详细教程

Jni 学习之路--入门尝鲜详细教程

作者: 老师好我是小明同学 | 来源:发表于2019-08-14 14:18 被阅读0次

    一、入门准备

    鉴于方便入门尝鲜,先准备好 visual studio(我是用2013版),eclipse。visual studio 用于编写 c 代码,生成动态 dll 文件,eclipse 用于编写调用 native 的代码。

    二、编写代码

    第 1 步,在 eclipse 新建一个 Java 项目,新建一个类为 Simple1.java

    代码如下:

    public class Simple1 {
        public static void main(String[] args) {
            // 1.2 编写程序,准备测试
            Simple1 simple1 = new Simple1();
            String nativeString = simple1.getNativeString();
            System.out.println("nativeString:" + nativeString);
        }
        
        // 1.1 编写调用的 native 方法
        public native String getNativeString();
    }
    

    此处先不用跑起项目代码,跑了也是会报错。

    第 2 步,在资源管理器中找到 eclipse 的该项目目录下的 src 目录,然后在 地址栏 前面加上 “cmd ”,注意,有一个空格,目的是 cmd 命令直接 cd 到该位置。

    第 3 步,编写命令生成 jni 的 .h 头文件

    输入命令为

    javah -d ../jni -jni com.vegen.study.Simple1
    

    然后在 eclipse 中刷新一下项目,就会看到com_vegen_study_Simple1.h

    第 4 步,在 visual studio 新建一个项目

    4.1 创建后,在 jdk 安装目录搜索 “jni” 关键字,将这两个头文件复制
    4.2 在 pc 中找到 vs 创建的项目目录,将 上面的 两个头文件,以及 eclipse 那个项目生成的头文件都复制粘贴到项目目录下
    4.3 在头文件这里,右键添加一个新建项

    4.4 将后缀改为 .c

    5.编写 c 代码

    com_vegen_study_Simple1.h 文件中,需注意有两点:
    5.1 从 <jni.h> 改成"jni.h"
    5.2 native 方法的函数声明,等待被 copy
    com_vegen_study_Simple1.h 具体代码

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include "jni.h"   // 5.1 从 <jni.h> 改成 "jni.h"
    /* Header for class com_vegen_study_Simple1 */
    
    #ifndef _Included_com_vegen_study_Simple1
    #define _Included_com_vegen_study_Simple1
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_vegen_study_Simple1
     * Method:    getNativeString
     * Signature: ()Ljava/lang/String;
     */
    // 5.2 native 方法的函数声明,此处等待被 copy
    JNIEXPORT jstring JNICALL Java_com_vegen_study_Simple1_getNativeString
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    

    Simple.c 文件中,需注意的有四点:
    5.3 引入我们的 native 方法的头文件
    5.4 从 com_vegen_study_Simple1.h 的 5.2 处将函数声明 copy 过来修改
    5.5 补上参数
    5.6 构造一个 jstring 返回,jstring 相当于 Java 的 String
    Simple1.c 具体代码

    // 5.3 引入我们的 native 方法的头文件
    #include "com_vegen_study_Simple1.h"
    
    // 5.4 从 com_vegen_study_Simple1.h 的 5.2 处将函数声明 copy 过来修改
    JNIEXPORT jstring JNICALL Java_com_vegen_study_Simple1_getNativeString
    (JNIEnv *env, jobject jobj) {   // 5.5 补上参数
        // 5.6 构造一个 jstring 返回,jstring 相当于 Java 的 String
        return (*env)->NewStringUTF(env, "Hello,I'm native string value");
    }
    

    三、vs 生成解决方案

    要生成解决方案,需要先配置好配置类型和平台

    1. 配置类型的修改:调试-->StudyProject属性-->配置属性-->常规-->配置类型-->修改为 动态库(.dll)

    2. 平台的修改

    生成-->配置管理器-->平台-->新建一个x64平台-->选择x64平台


    3.(重新)生成解决方案

    已经生成了解决方案的话就重新生成解决方案,然后可以看到 dll 文件生成成功



    copy 此 dll 的完整目录,回到 eclipse。

    四、编写加载 dll 动态库的代码

    static {
            System.load("E:/study/vsworkspace/StudyJniProject/x64/Debug/StudyJniProject.dll");
        }
    

    Simple1.java 完整代码

    package com.vegen.study;
    
    public class Simple1 {
    
        public static void main(String[] args) {
            // 2.编写程序,准备测试
            Simple1 simple1 = new Simple1();
            String nativeString = simple1.getNativeString();
            System.out.println("nativeString:" + nativeString);
        }
        
        // 1.编写调用的 native 方法
        public native String getNativeString();
        
        // 3.加载 dll 动态库
        static {
            System.load("E:/study/vsworkspace/StudyJniProject/x64/Debug/StudyJniProject.dll");
        }
    }
    

    到此,已经可以完成所有的代码编写,下面运行一下看看我们的成果啦


    哈哈,我的成功调用了,你的成功了吗?如果有疑问,欢迎评论交流哦~
    demo 源码下载地址:https://github.com/Vegen/StudyFiles

    相关文章

      网友评论

          本文标题:Jni 学习之路--入门尝鲜详细教程

          本文链接:https://www.haomeiwen.com/subject/ekygjctx.html