关闭

Android NDK 开发(一)JNI简介及调用流程

标签: androidandroid ndkjnijavac语言
1749人阅读 评论(0) 收藏 举报
分类:

转载请标明出处: http://blog.csdn.net/u011974987/article/details/52602913
本文出自:【stromxu的博客】

前言

前段时间学习了C、C++的一些基础知识后,了解了它们的编码风格,要想掌握NDK开发,前提是会使用JNI,下面我们开始简单的介绍吧!

JNI简介

  JNI全称是Java Native Interface(Java本地接口),本地接口就是指用C和C++开发的接口。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。
  
  开发JNI程序会受到系统环境的限制,因为用C/C++语言写出来的代码或模块,编译过程当中要依赖当前操作系统环境所提供的一些库函数,并和本地库链接在一起。而且编译后生成的二进制代码只能在本地操作系统环境下运行,因为不同的操作系统环境,有自己的本地库和CPU指令集,而且各个平台对标准C/C++的规范和标准库函数实现方式也有所区别。这就造成使用了JNI接口的JAVA程序,不再像以前那样自由的跨平台。如果要实现跨平台,就必须将本地代码在不同的操作系统平台下编译出相应的动态库。

JNI的开发流程主要分为以下几个步骤:

  1. 编写带有native声明方法的java类;

  2. 用”javac”命令来编译所编写的java类;

  3. 使用”javah”java类的名生成扩展名为h的头文件;

  4. 复制jni.h和jni_md.h文件到CPP工程中;

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

  6. 生成dll动态链接库

  7. 配置dll文件所在目录到环境变量

  8. 重启Eclipse

jni调用dill的流程图如下:

这里写图片描述

通过上面的分析,相信大家已经对jni的开发流程有一个整体的认识,接下来,我们将通过实例更进一步的了解。

第一步:编写带有native声明方法的java类

JniTest.java

package com.study.jni;

public class JniTest {

    public native static String getStringFromC();
}

第二步:用”javac”命令来编译所编写的java类;

首先我们必须得配有java环境变量,然后我们右键点击项目->properties,复制项目路径;

这里写图片描述

然后进入dos命令,

C:\Users\uuxuh>cd E:\Documents\11\JniTest

C:\Users\uuxuh>E:

E:\Documents\11\JniTest>cd src

E:\Documents\11\JniTest\src>

第三步:使用”javah”java类的名生成.h的头文件

接着,复制我们的完整类名(包名+类名),执行命令:

E:\Documents\11\JniTest\src>javah com.study.jni.JniTest

回到工程目录下,刷新项目,编译后的.h头文件就出现了。

源码:

com_study_jni_JniTest.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_study_jni_JniTest */

#ifndef _Included_com_study_jni_JniTest
#define _Included_com_study_jni_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_study_jni_JniTest
 * Method:    getStringFromC
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_study_jni_JniTest_getStringFromC
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

第四步:复制jni.h和jni_md.h文件到CPP工程中

将要编译的文件中引入了

#inlcude<jni.h>

头文件,所以我们手动导入这两个文件到CPP工程中,

以我的jdk1.7.0_75为例,两个头文件的位置分别为:

jni.h    jdk1.7.0_75/include
jni_md.h    jdk1.7.0_75/include/linux

将我们生成.h头文件复制到项目的代码文件目录下 , 在解决方案中的头文件目录-> 右键-> 添加 -> 添加现有项 。 将我们的头文件添加进来,还有jni.h和jni_md.h一起添加进来,如图:

这里写图片描述

第五步:实现.h头文件中声明的函数

c代码如下:

#include "com_study_jni_JniTest.h"

//函数实现
JNIEXPORT jstring JNICALL Java_com_study_jni_JniTest_getStringFromC
(JNIEnv *env, jclass jcls){
    //简单的实现
    //JNIEnv 结构体指针
    //env二级指针
    //代表Java运行环境,调用Java中的代码
    //简单的实现
    //将C的字符串转为一个java字符串
    return (*env)->NewStringUTF(env, "C String");


}

第六步:生成dll动态链接库

我们以VS2013为例:

操作步骤:

选中项目 -> 右键 -> 属性 -> 常规 -> 项目默认值 -> 配置类型 , 选择动态库.dll,

这里写图片描述

如图,右上角配置管理器,根据我们所使用的平台进去配置一下:

这里写图片描述

这里我使用64位的,所以活动解决方案平台下新建了一个x64,部署项目配置也选择x64。

配置完了之后,最后生成解决方案。去项目目录下查看dll动态库。

这里写图片描述

第七步:配置dll文件所在目录到环境变量

我们把生成dll文件的路径配置java环境变量里面,这样java 才会知道有dll动态库存在,配置完之后,重启下Eclipse。

最后我们在java中调用动态库,完整代码:

package com.study.jni;

public class JniTest {

    public native static String getStringFromC();

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

// 加载动态库
    static{
       System.loadLibrary("jni_study");
    }

}

最后运行一下项目控制台打印出C中返回给我们的字符串。

这里写图片描述

好了,整个jni的调用流程已经说的非常详细了,但这只是jni入门的基础,后续会继续更新!

学习理解并整理下来的笔记。
希望大家能够指点或提出宝贵意见,谢谢!一起学习。
转载请注明出处:http://blog.csdn.net/u011974987/article/details/52602913
个人主页:xuhaoblog.com

2
0
查看评论

android之JNI开发步骤总结

这几天一直在研究JNI的开发过程,顺便把NDK环境搭建一起总结下。在windows环境下开发jni需要c/c++编译器的支持,网络上我看很多人使用cygwin。呵呵我不是很喜欢使用它,感觉安装起来挺麻烦的。我使用GNUStep,下载地址http://www.gnustep.org/experienc...
  • dj0379
  • dj0379
  • 2016-12-23 14:48
  • 323

android JNI开发基本步骤

1.编写java类,定义Native方法,这里的native方法就是后面.c文件(c/c++语言)里面要实现的方法名。示例:public class JniClient { public static native String AddStr(String strA,String strB)...
  • yinzhiwei2014
  • yinzhiwei2014
  • 2016-02-23 11:56
  • 6353

基于老罗的freg案例,使用NDK工具调用驱动流程详细分析

鉴于老罗的《Android内核源代码情景分析的
  • laoliu_lcl
  • laoliu_lcl
  • 2014-09-16 16:14
  • 697

Android jni的调用过程

1、JNI简介 JNI全称为Java Native Interface(JAVA本地调用)。从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)进行交互。并非从Android发布才引入JNI的概念的。 2、...
  • u011467537
  • u011467537
  • 2015-11-19 07:11
  • 2233

Android中JNI调用过程简述

1.安装和下载cygwin,下载Android NDK; 2.在ndk项目中JNI接口的设计; 3.使用C/C++实现本地方法; 4.JNI生成动态链接库.so文件; 5.将动态链接库复制到java工程,在Java工程中调用,运行Java工程即可。
  • berber78
  • berber78
  • 2014-12-22 00:11
  • 14946

Android的NDK开发(1)————Android JNI简介与调用流程

原文: http://blog.csdn.net/conowen/article/details/7521340 1、JNI简介 JNI全称为Java Native Interface(JAVA本地调用)。从Java1.1开始,JNI成为java平台的一部分,它允许...
  • luhuajcdd
  • luhuajcdd
  • 2012-07-16 09:30
  • 18330

Android调用JNI的简单实例(附详细步骤)

最近想调用FFmepg库来做编解码的东西,首先就得学会使用JNI(JAVA Native Interface)调用。 下面做个简单的JNI调用实例,中间遇到的问题及解决过程省略一万字,查找到的资料也都是东一句西一句的,整理一下完整的实现过程,希望对初学JNI的朋友有所帮助: 1、创建一个Androi...
  • EricFantastic
  • EricFantastic
  • 2015-10-21 09:45
  • 4733

【JNI】拒绝各种坑!Android Studio 下创建JNI项目

一时间来,又是几个月的时间没有写文章了,你干啥去了=。=,忙着各种事情,让我这几个月感触最深的,就是JNI了,JNI真是个有趣的东西,废话少说,咱们一起来看看,怎么用JNI来写一些有用的东西,因为网上的教程很多,很多。。真的很多,而且有些已经很老了或是不能那么弄,坑还是很多的,所以写了这篇文章,希望...
  • u011539882
  • u011539882
  • 2016-05-17 17:30
  • 4838

JNI开发----一点一点搞清楚NDK开发的步骤

NDK开发流程不同版本的Android Studio可能对于NDK的配置是不一样的,本文记录我在AS2.2.2版本上的配置过程。步骤1:安装配置NDK(1)打开AS的Project Structure目录,如下:点击Android NDK location 下方的Download来下载NDK,下载好...
  • ccg_201216323
  • ccg_201216323
  • 2017-01-15 18:13
  • 1398

JNI/NDK开发指南(开山篇)

转载请注明出处:         相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术,由其做过Android的朋友,为了应用的安全性,会将一些复杂的逻辑和算法通过本地代码(C或C++)来实现,然后打包成so动态库文件,并提供Java接...
  • xyang81
  • xyang81
  • 2014-12-05 23:41
  • 18601
    个人资料
    • 访问:256822次
    • 积分:3278
    • 等级:
    • 排名:第12281名
    • 原创:76篇
    • 转载:5篇
    • 译文:2篇
    • 评论:87条
    个人网站
    博客专栏