前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JNI--基本介绍和使用

JNI--基本介绍和使用

作者头像
aruba
发布2020-07-03 11:43:46
5540
发布2020-07-03 11:43:46
举报
文章被收录于专栏:android技术

JNI全名为:Java Native Interface,用于连接Java和C/C++桥梁,通过JNI,Java语言可以调用C/C++的函数,反之C/C++也可以调用Java的变量和方法,一般使用环境为:当Java满足不了程序的需要,如算法、图像渲染等高性能消耗操作时,需要访问一些C/C++代码提高性能

NDK:工具的集合。帮助开放者快速开放C/C++ 动态库的工具。开发JNI不是必须使用NDK,它只不过方便我们使用而已

下面介绍JNI的基本使用:

1.由于考虑到安卓开发人员只有AS工具,这边就使用AS新建一个项目,并创建一个带有main函数的类:

代码语言:javascript
复制
package com.aruba.jniapplication;

public class JniDemo {

    public static native String getStringFromC();

    public static void main(String[] args) {

    }
}

2.编写native方法

代码语言:javascript
复制
    /**
     * 调用C++语言获取一个字符串
     * @return
     */
    public static native String getStringFromC();

在cmd中执行javah命令,注意!!要切换目录到主包名下,我这边包名是com.aruba.jniapplication,所以我需要在存放com文件夹的目录下执行

生成了.h文件

3.编写C/C++代码之前,我们需要做一些准备操作

1.将jni.h 和jni_md.h复制到编译C/C++的环境

使用visual studio新建一个项目,并把两个.h文件放入,由于vs默认使用连接,不会复制文件到自己的项目中,所以我们手动把文件拷贝到vs的项目中,再通过右击-添加现有项的方式添加.h文件

2.将我们生成的.h文件也放入编译环境,名字可以随意修改

4.C++比C使用起来方便,所以我们现在开始在jni目录下编写C++代码

新建一个myJni.cpp

代码语言:javascript
复制
#include "my_jni.h"
#include <string>

using namespace std;

JNIEXPORT jstring JNICALL Java_com_aruba_jniapplication_JniDemo_getStringFromC
(JNIEnv* env, jclass jclz) {
    //新建一个string对象
    string s = "hello form C++";
    jstring jstr = env->NewStringUTF(s.c_str());
    return jstr;
}

5.生成动态库

将配置管理器中的平台修改成64位

右击项目,进入属性

改为生成动态库

点击上面菜单栏的生成,选择重新生成解决方案

最后成功生成动态库

将生成的dll复制到我们的AS项目中

6.Java中加载动态库,调用native方法

代码语言:javascript
复制
public class JniDemo {

    static {
//        System.out.println(System.getProperty("java.library.path"));
        System.load("C:\\Users\\tyqhc\\Documents\\workspace\\JniApplication\\app\\src\\main\\java\\com\\aruba\\jniapplication\\myJni.dll");
//        System.loadLibrary("myJni");
    }
    
    public static native String getStringFromC();

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

System.load方法需要传入绝对路径,我们来运行看下效果:

JNI的具体使用流程就这么些,之后会再介绍静态native函数和非静态native函数的区别,以及C/C++调用Java中的变量等

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档