本文转自: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. 【树上莫队】bzoj3757 苹果树

    学习这位神犇的:http://blog.csdn.net/jiangyuze831/article/details/41476865 注意: ①排序时第一关键字是左端点所在块编号(块状树),第二关键字 ...

  2. 1.2(学习笔记)Servlet基础(doGet、doPost、生命周期、页面跳转)

    一.doGet()与doPost() 我们在TestServlet类中重写doGet().doPost().service(). import javax.servlet.ServletExcepti ...

  3. python的编码程序例题

    有一段python的编码程序如下:urllib.quote(line.decode("gbk").encode("utf-16")),请问经过该编码的字符串的解 ...

  4. cocoods 出现下面的问题:ERROR: While executing gem ... (Errno::EPERM)

    今天安装cocoods 出现下面的问题:ERROR:  While executing gem ... (Errno::EPERM)     Operation not permitted - /us ...

  5. Redis Exception: Exceeded timeout of 00:00:03

    Redis Exception: Exceeded timeout of 00:00:03 居然是 重启了网管, 把网络禁用重启就好了. 服 最终更新: 原来是架构湿      设置为每分钟只能读取6 ...

  6. Windows 无法验证此设备所需的驱动程序的数字签名。某软件或硬件最近有所更改,可能安装了签名错误或损毁的文件,或者安装的文件可能是来路不明的恶意软件。(代码52)

    由未签名驱动导致的键鼠装无法使用的问题 usb 问题失效. 要是win 10的话  导致的结果就是 无线键鼠套装无法使用. 解决办法是 1.按下shift 按键 点击重启按钮 重启后 2.疑难解答-- ...

  7. nginx 隐藏index.php 并开启rewrite日志调试(apache也有)

    开启rewrite 日志 error_log       /data/log/nginx/error.log notice; 位于最外层,大约在文件的前几行 再在http{}括号里增加一行:rewri ...

  8. lync项目总结

    概述 9月份,由于公司人事变动,摆在自己面前也有两条路可选择,一是选择lync,二是选择sharepoint,由于之前,部门老大已经让我看了大概一个月的有关lync方面的资料(文档,代码,项目实施等) ...

  9. Kubernetes连接外部数据源

    Kubernetes架构下比较核心的问题是数据如何persistance,虽然提供了Persistent volumn的方式,但是对于像数据库之类的产品在kubernetes集群环境中运行和管理还是很 ...

  10. 64位的centos6.9的vnc-sever的安装及桌面环境安装

    1.VNC (Virtual Network Computer)是虚拟网络计算机的缩写.VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件,远程控制能力强大,高效实用,其性能可以和 ...