Android JNI和NDK学习(02)--静态方式实现JNI(转)
本文转自: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(转)的更多相关文章
- Android JNI和NDK学习(03)--动态方式实现JNI(转)
本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3092491.html 前面总结了静态实现JNI的方法,本文介绍如何动态实现J ...
- Android JNI和NDK学习(04)--NDK调试方法(转)
本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3092812.html 本文主要介绍在ndk中添加log的方法.然后,我们就可 ...
- android的JNI 、 NDK 学习!
转载的! Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) ...
- Android JNI和NDK学习(01)--搭建NDK开发环境(转)
本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3095013.html 本文主要介绍“JNI”.“Android NDK”以及 ...
- Android JNI和NDK学习(06)--JNI的数据类型(转)
本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3094037.html 本文介绍JNI的数据类型.NDK中关于JNI数据类型的 ...
- Android JNI和NDK学习(09)--JNI实例二 传递类对象
1 应用层代码 NdkParam.java是JNI函数的调用类,它的代码如下: package com.skywang.ndk; import android.app.Activity; impo ...
- Android JNI和NDK学习(05)--JNI真机调试(转)
本文转自: http://www.cnblogs.com/skywang12345/archive/2013/05/23/3094250.html 本文主要介绍如何将JNI导入到真机进行调试.下面以M ...
- Android(java)学习笔记257:JNI之helloword案例(利用NDK工具)
1.逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们要 ...
- Android(java)学习笔记201:JNI之helloword案例(利用NDK工具)
1. 逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们 ...
随机推荐
- c++基础学习之string
//学习使用string类 2013-10-18 lingc #include <iostream> #include <string>//include this head ...
- 洛谷 P2742 [USACO5.1]圈奶牛Fencing the Cows
题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入 ...
- 【左偏树】HDU1512-Monkey King
[题目大意] 在一个森林里住着N(N<=10000)只猴子.在一开始,他们是互不认识的.但是随着时间的推移,猴子们少不了争斗,但那只会发生在互不认识(认识具有传递性)的两只猴子之间.争斗时,两只 ...
- 5.8 Properties
一.Propertie 主要用于读写资源配置文件. Properties继承自Hashtable. 我们来看下HashMap和Hashtable的区别: Hashtabl 线程安全, 同步, ...
- 在energia中添加新的库
很多时候energia提供的库不能够满足我们的需要,这个时候我们就要自己添加库到energia中.方法如下: 在energia目录下找到hardware目录 选择对应的单片机型号文件夹进入 进入lib ...
- docker常用命令 状态图
http://blog.csdn.net/permike/article/details/51879578
- TOleDBMSSQLConnectionProperties驱动MSSQL数据库
TOleDBMSSQLConnectionProperties驱动MSSQL数据库 为了让MORMOT可以驱动所有版本的MSSQL,需要改用SQLOLEDB,因为所有的WINDOWS操作系统里面都提供 ...
- 刷新神经网络新深度:ImageNet计算机视觉挑战赛微软中国研究员夺冠
微软亚洲研究院首席研究员孙剑 世界上最好计算机视觉系统有多精确?就在美国东部时间12月10日上午9时,ImageNet计算机视觉识别挑战赛结果揭晓——微软亚洲研究院视觉计算组的研究员们凭借深层神经网络 ...
- 如何使用ninja编译系统编译我们的程序?
使用ninja 配置自己的环境来使用ninja 构建程序 Android使用ninja Windows使用 调试 不使用VS 技巧 问题 Ninja的原意是忍者,忍者神龟的忍者.这里被google拿来 ...
- Centos系统信息及日志
1.确认内核版本: #uname -r #uname -a 2.确认发行版本: #cat /etc/redhat-release 3.查看系统载入的模块: #lsmod | grep XXX 载入一个 ...