Android-NDK/JNIJava系列文章

JNI系列入门之Hello JNI C(一)

2017-03-02  本文已影响370人  JerryloveEmily

JNI系列文章:
JNI系列之入门Hello JNI C(一)
JNI系列之入门Hello JNI C(二)
JNI系列入门之C语言与Java的双向通信(一)
JNI系列入门之C语言与Java的双向通信(二)
JNI系列入门之C语言中文字符串乱码问题


一、概述

Java发展至今流行度和覆盖广度已经遍布各行各业,这依赖于它的跨平台,易于入门编写,强大的社区,带来的各种各样的框架,以及功能API库。然而还是有它的局限性,比如Java的安全性(Java容易被反编译)、性能、内存管理(成也垃圾回收,败也垃圾回收),正式程序员无法直接的管控到内存,才容易导致内存泄漏GC无法回收。为了解决这些问题使用更加高效的c/c++,于是出现了JNI(Java Native Interface)Java本地接口,便于java语言和c/c++语言的通信。

注意前方高能: 学习JNI必须有C/C++的基础,否则Native层的工程代码你会一知半解,甚至一路懵逼,严重的易导致扔鼠标、砸电脑,然后就是入门到放弃

二、环境搭建

  1. Java代码的编写目前使用Eclipse,C/C++的代码编写以及编译运行环境是Visual Studio + Windows 64位
  2. 首先配置Java的 jdk环境变量,这个对于一个java的老司机来说太简单了不多说。
  3. 安装好Visual Studio这个也不用说,问度娘,我的VS版本是:Visual Studio community 2015,安装包有点大,安装挺快的,也就大概一天吧,哈哈哈哈哈哈哈哈哈。

三、编码实现

package com.jerry.jnitest;
public class JniTest {

    public static void main(String[] args) {
        
    }
}

在类中写入native的方法(就是java调用C/C++的方法)

/**
 * 通过jni,获取c中返回的字符串
 * @return 字符串
 */
public native static String getStringFromC();

完整代码如下:

package com.jerry.jnitest;
public class JniTest {

    public static void main(String[] args) {
        // 调用native方法,获取C中返回的字符串数据
        String text = getStringFromC();
        System.out.println(text);
    }
    
    static {
        System.loadLibrary("JniStudy");
    }
    
    /**
     * 通过jni,获取c中返回的字符串
     * @return 字符串
     */
    public native static String getStringFromC();
}
#include "com_jerry_jnitest_JniTest.h"
JNIEXPORT jstring JNICALL Java_com_jerry_jnitest_JniTest_getStringFromC
(JNIEnv *env, jclass jcls) {
    char *str = "Hello Jerry welcome to Jni World!";
    return (*env)->NewStringUTF(env, str);
}

这个就是实现return一个C的字符串。这样native函数就实现了,接下来就是生成动态链接库供java来调用native方法。

Paste_Image.png

四、总结

  1. 在java工程编写native方法
  2. 使用javah 命令生成头文件
  3. 拷贝头文件到C工程,以及相应的jni.h、jni_md.h头文件
  4. 实现头文件的native方法
  5. 修改VS编译运行环境,配置项改成生成dll动态库
  6. 生成解决方案,配置dll动态库所在目录到系统环境变量
  7. 重启Eclipse,运行java工程

JNI系列文章:
JNI系列之入门Hello JNI C(一)
JNI系列之入门Hello JNI C(二)
JNI系列入门之C语言与Java的双向通信(一)
JNI系列入门之C语言与Java的双向通信(二)
JNI系列入门之C语言中文字符串乱码问题

上一篇下一篇

猜你喜欢

热点阅读