01.jni开发流程

前提

jni开发主要是指java调用c/c++方法,获取在c/c++中调用java方法,本次使用的开发工具是eclipse,请不要感觉用eclipse就不行了,其实会了eclipse,Android Studio用起来是一样的,对于c/c++的语言使用的是vs2013,没有下载的自己去搜索下载。

1.编写native方法

package com.gxl.jni;

public class JniTest {
    //native方法
    public native static String getStringFromC();

    public static void main(String[] args) {
        String text = getStringFromC();
        System.out.println(text);
    }
}

2.javah命令,生成.h头文件

配置好jdk的环境变量,javah是jdk\bin\javah.exe

打开cmd命令行
cd 到当前项目下如 当前项目目录为 D:\EclipseWorkSpace\jni_01\src
cd d:
cd D:\EclipseWorkSpace\jni_01\src
//接着使用javah生成相应的.h头文件
javah  com.gxl.jni.JniTest

//会生成相应的头文件,如果发生类找不到错误,则如下操作
//到项目的src根目录下,然后运行
set classpath=D:\EclipseWorkSpace\jni_01\src 
javah -jni com.gxl.jni.JniTest

//可以如下命令
javah -classpath . -jni com.gxl.jni.JniTest
//如果头文件是utf8编码格式的
javah -encoding UTF-8 -classpath . -jni com.gxl.jni.JniTest

生成的头文件 com_gxl_jni_JniTest.h 如下

/* DO NOT EDIT THIS FILE - it is machine generated */
//依赖jni.h
#include <jni.h>
/* Header for class com_gxl_jni_JniTest */
//如果没有定义则定义
#ifndef _Included_com_gxl_jni_JniTest
#define _Included_com_gxl_jni_JniTest
//如果是c++
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_gxl_jni_JniTest
 * Method:    getStringFromC
 * Signature: ()Ljava/lang/String;
 */
 //jstring 是返回类型  Java_包名_类名_方法名
JNIEXPORT jstring JNICALL Java_com_gxl_jni_JniTest_getStringFromC
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

3.复制.h头文件到CPP工程中

打开vs,新建项目jni01_study,然后将生成的头文件复制到项目目录下中
这里写图片描述
由于com.gxl.jni.JniTest.h 依赖jni.h 而jni.h 又依赖jni.md.h
所以还要将jni.h和jni.md.h一块复制到cpp项目中

jni.h和jni.md.h在jdk目录下,如我的地址如下:

jni.h在   F:\Program Files\Java\jdk1.8.0_161\include\jni.h
jni.md.h在  F:\Program Files\Java\jdk1.8.0_161\include\win32\jni.md.h

通过如下方法将上面的三个 .h文件引入到项目中
这里写图片描述
添加现有项 将三个 .h 文件引入即可

4.实现.h头文件中声明的函数

接着新建01.c来实现头文件中的方法逻辑

//引用头文件
#include "com_gxl_jni_JniTest.h"

//实现函数
JNIEXPORT jstring JNICALL Java_com_gxl_jni_JniTest_getStringFromC
(JNIEnv * env, jclass jcl){
    //JNIEnv 结构体指针
    //env二级指针
    //代表Java运行环境,调用Java中的代码

    //简单的实现
    //将C的字符串转为一个java字符串

    //JNIEnv 在C++中就是一个结构体的别名
    //env 在C++中一个结构体的一级指针
    return (*env)->NewStringUTF(env,"c string");
}

5.生成 .dll

1.选中 debuge –> 配置管理器
修改如下
这里写图片描述
2.右键项目选中属性
这里写图片描述
修改如下
这里写图片描述

3.生成解决方案
这里写图片描述

6.配置dll的环境变量

这里有两种方式

第一种

将.dll的路径配置到电脑的环境变量的path路径中
这里写图片描述

第二种

也可以将.dll复制到eclipse项目的根目录下。

8.加载动态dll库

package com.gxl.jni;

public class JniTest {

    public native static String getStringFromC();

    public static void main(String[] args) {
        String text = getStringFromC();
        System.out.println(text);
    }
    //加载动态库
    static{
        System.loadLibrary("jni01_study");
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值