一、入门准备
鉴于方便入门尝鲜,先准备好 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();
}
1
2
3
4
5
6
7
8
9
10
11
此处先不用跑起项目代码,跑了也是会报错。
第 2 步,在资源管理器中找到 eclipse 的该项目目录下的 src 目录,然后在 地址栏 前面加上 “cmd ”,注意,有一个空格,目的是 cmd 命令直接 cd 到该位置。
第 3 步,编写命令生成 jni 的 .h 头文件
输入命令为
javah -d ../jni -jni com.vegen.study.Simple1
1
然后在 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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");
}
1
2
3
4
5
6
7
8
9
三、vs 生成解决方案
要生成解决方案,需要先配置好配置类型和平台
1. 配置类型的修改:调试–>StudyProject属性–>配置属性–>常规–>配置类型–>修改为 动态库(.dll)
2. 平台的修改
生成–>配置管理器–>平台–>新建一个x64平台–>选择x64平台
3.(重新)生成解决方案
已经生成了解决方案的话就重新生成解决方案,然后可以看到 dll 文件生成成功
copy 此 dll 的完整目录,回到 eclipse。
四、编写加载 dll 动态库的代码
static {
System.load("E:/study/vsworkspace/StudyJniProject/x64/Debug/StudyJniProject.dll");
}
1
2
3
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");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
到此,已经可以完成所有的代码编写,下面运行一下看看我们的成果啦
哈哈,我的成功调用了,你的成功了吗?如果有疑问,欢迎评论交流哦~
demo 源码下载地址:https://github.com/Vegen/StudyFiles
————————————————
版权声明:本文为CSDN博主「老师好我是小明同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Androidtalent/article/details/99566125