热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AndroidJNI和NDK学习(02)静态方式实现JNI(转)

本文转自:http:www.cnblogs.comskywang12345archive201305233095013.htmlJNI包括两种实现方法:

本文转自: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 {@Overridepublic 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 /* Header for class com_skywang_ndk_Myndk */#ifndef _Included_com_skywang_ndk_Myndk#define _Included_com_skywang_ndk_Myndk#ifdef __cplusplusextern "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
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&#xff0c;内容如下&#xff1a;

LOCAL_PATH :&#61; $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE :&#61; hello_jni
LOCAL_SRC_FILES :
&#61; hello_jni.cinclude $(BUILD_SHARED_LIBRARY)

6 编译生成库文件

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

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

生成库文件所在目录&#xff1a;libs/armeabi/libhello_jni.so

 

7 重新运行工程

重新运行eclipse下的myndk工程。输出如下&#xff1a;

 



推荐阅读
author-avatar
建铭琼伶俊涵
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有