本文转自: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工程。输出如下:

最新文章

  1. [信安presentation]Fight against GFW
  2. 【bzoj1085】 SCOI2005—骑士精神
  3. Ubuntu16.04安装docker
  4. STM32 MX Cube生成的工程中 使用printf向Uart发送数据
  5. CI 框架访问 http://[::1]/yourproject/
  6. uva 699 the falling leaves——yhx
  7. ACM题目————Aggressive cows
  8. Ext Js学习之IIS理解
  9. res\menu\main.xml:6: error: No resource identifier found for attribute &#39;showAsAction&#39; in package &#39;com.xxx.xxxx&#39;
  10. 关于mac上的homebrew
  11. Bzoj 3171: [Tjoi2013]循环格 费用流
  12. ScrollView与ListView合用(正确计算Listview的高度)的问题解决
  13. Swift—类的继承-备
  14. c++中,size_typt, size_t, ptrdiff_t 简介
  15. Unity 通过NGUI 完成单摄像机 制作地图
  16. 实现栈最小元素的min函数
  17. oc UIAlertController封装
  18. ping命令使用技巧(一次Ping多个地址)
  19. nginx隐藏tp路由index.php
  20. webbug3.0靶场第二关

热门文章

  1. Oracle 后台进程 详细说明
  2. 【博弈论】【SG函数】【枚举】bzoj1874 [BeiJing2009 WinterCamp]取石子游戏
  3. 【莫队算法】bzoj3781 小B的询问
  4. WebSocket 实战(转)
  5. HashMap源码分析(Java8)
  6. NHibernate官方文档中文版--只读实体类型(Read-only entities)
  7. 【Node.js】3.Node.js和commomJS规范
  8. ActiveX控件在项目中的应用
  9. java中short、int、long、float、double取值范围
  10. @Autowired与@Resource的使用方法和差别