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

2019-08-14  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读