本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3095013.html

JNI包括两种实现方法:静态和动态。两种方法的区别如下:

静态:先由Java得到本地方法的声明,然后再通过JNI实现该声明方法。

动态:先通过JNI重载JNI_OnLoad()实现本地方法,然后直接在Java中调用本地方法。

本文介绍静态实现方式,下一篇会介绍动态实现方式。

1 首先,在Eclipse下新建一个工程myndk

Myndk.java的代码如下:

package com.skywang.ndk;

 import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView; public class Myndk extends Activity { @Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState); TextView myTextView = new TextView(this);
myTextView.setText( HelloNdk() );
setContentView(myTextView);
} public native String HelloNdk(); static {
System.loadLibrary("hello_jni");
}
}

2 运行工程,生成.class文件

检查bin目录,若有生成Myndk.class;则继续下一步。生成.class文件的目的,是为下一步生成.h头文件做准备。

3 编译生成.h文件

打开终端,切换到工程所在目录。假设工程目录为“/hom/skywang/workspace/ndk/myndk”,则通过以下命令切换目录:

$ cd /home/skywang/workspace/ndk/myndk/

查看文件列表

$ ls
$ AndroidManifest.xml assets bin gen proguard-project.txt project.properties res src

新建jni目录,并查看文件列表

$ mkdir jni; ls
$ AndroidManifest.xml assets bin gen jni proguard-project.txt project.properties res src

生成javah文件

$ javah -classpath bin/classes -d jni com.skywang.ndk.Myndk

-classpath:后面接“类的路径”。
-d : 后面接“生成的头文件存放的目录”,d表示destination。
com.example.hellojni.HelloJni:是完整类名。

上诉命令生成的的.h文件路径:jni/com_skywang_ndk_Myndk.h 

生成文件内容:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_skywang_ndk_Myndk */ #ifndef _Included_com_skywang_ndk_Myndk
#define _Included_com_skywang_ndk_Myndk
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_skywang_ndk_Myndk
* Method: HelloNdk
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_skywang_ndk_Myndk_HelloNdk
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif
#endif

补充:若执行javah命令时,遇到如下错误。是因为-classpath后面所接的路径不对!

error: cannot access com.skywang.ndk.Myndk
class file for com.skywang.ndk.Myndk not found
javadoc: error - Class com.skywang.ndk.Myndk not found.
Error: No classes were specified on the command line. Try -help.

有了com_skywang_ndk_Myndk.h头文件之后,我们就可以实现该头文件中声明的函数。

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

新建文件jni/hello_jni.c。hello_jni.c的代码如下:

#include <string.h>
#include <jni.h> JNIEXPORT jstring JNICALL Java_com_skywang_ndk_Myndk_HelloNdk
(JNIEnv* env, jobject obj)
{
return (*env)->NewStringUTF(env, "Hello JNI!");
}

hello_jni.c的作用就是实现com_skywang_ndk_Myndk.h中声明的函数。

5 编写实现函数对应的Android.mk

添加文件jni/Android.mk,内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello_jni
LOCAL_SRC_FILES := hello_jni.c include $(BUILD_SHARED_LIBRARY)

6 编译生成库文件

进入到工程所在目录,执行ndk-build,编译生成.so库文件。

$ cd /home/skywang/workspace/ndk/myndk/
$ ndk-build

生成库文件所在目录:libs/armeabi/libhello_jni.so

7 重新运行工程

重新运行eclipse下的myndk工程。输出如下:

Android JNI和NDK学习(02)--静态方式实现JNI(转)的更多相关文章

  1. Android JNI和NDK学习(03)--动态方式实现JNI(转)

    本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3092491.html 前面总结了静态实现JNI的方法,本文介绍如何动态实现J ...

  2. Android JNI和NDK学习(04)--NDK调试方法(转)

    本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3092812.html 本文主要介绍在ndk中添加log的方法.然后,我们就可 ...

  3. android的JNI 、 NDK 学习!

    转载的! Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) ...

  4. Android JNI和NDK学习(01)--搭建NDK开发环境(转)

    本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3095013.html 本文主要介绍“JNI”.“Android NDK”以及 ...

  5. Android JNI和NDK学习(06)--JNI的数据类型(转)

    本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3094037.html 本文介绍JNI的数据类型.NDK中关于JNI数据类型的 ...

  6. Android JNI和NDK学习(09)--JNI实例二 传递类对象

    1 应用层代码 NdkParam.java是JNI函数的调用类,它的代码如下:   package com.skywang.ndk; import android.app.Activity; impo ...

  7. Android JNI和NDK学习(05)--JNI真机调试(转)

    本文转自: http://www.cnblogs.com/skywang12345/archive/2013/05/23/3094250.html 本文主要介绍如何将JNI导入到真机进行调试.下面以M ...

  8. Android(java)学习笔记257:JNI之helloword案例(利用NDK工具)

    1.逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们要 ...

  9. Android(java)学习笔记201:JNI之helloword案例(利用NDK工具)

    1. 逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们 ...

随机推荐

  1. 【分块答案】【最小生成树】【kruscal】bzoj1196 [HNOI2006]公路修建问题

    二分(分块)枚举 边权上限.用kruscal判可行性. #include<cstdio> #include<algorithm> #include<cstring> ...

  2. elasticsearch将数据导出json文件【使用elasticdump】

    1.前提准备 需要使用npm安装,还未安装的朋友可以阅读另一篇我的博客<安装使用npm>,windows环境. 2.安装es-dump 打开终端窗口PowerShell或者cmd. 输入命 ...

  3. python基础-文件处理与函数

    1. 文件处理 1.1 文件处理流程 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 1.2 文件读取模式r r文本模式的读,在文件不存在,不会创建新文件 f = ...

  4. 两道Java面试题!

    body { font-family: 微软雅黑; font-size: 14px; line-height: 2; } html, body { color: inherit; background ...

  5. 专访阿里巴巴研究员“赵海平”:Facebook的PHP底层性能优化之路(HipHop,HHVM)

    专访阿里巴巴研究员“赵海平”:Facebook的PHP底层性能优化之路 http://www.infoq.com/cn/articles/interview-alibaba-zhaohaiping

  6. 【SQL】查询数据库中某个字段有重复值出现的信息

    select name,mobile from [GeneShop].[dbo].[xx_member] where mobile in ( SELECT mobile FROM [GeneShop] ...

  7. CSS3: box-shadow 阴影

    box-shadow是给元素块添加周边阴影效果 语法: 对象选择器 {box-shadow:X轴偏移量 Y轴偏移量阴影 模糊半径 阴影扩展半径 阴影颜色 [投影方式] } box-shadow: h- ...

  8. T-sql脚本规范

    一.创建表 IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'表名') AND type in (N'U') ...

  9. RMAN备份恢复 控制文件和归档日志丢失情况

    RMAN> backup current controlfile tag='bak_ctlfile' format='/home/oracle/backup/bak_ctl_%U_%T'; al ...

  10. linux sudo使用学习记录

    sudo在linux中非常重要,它能够使普通的用户临时拥有root权限.但是如果让用户滥用sudo命令的话可能会造成严重的影响. 例如:修改root的密码,切换到root用户等等. 所以我们虽然需要赋 ...