博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android JNI和NDK学习(02)--静态方式实现JNI(转)
阅读量:5362 次
发布时间:2019-06-15

本文共 2900 字,大约阅读时间需要 9 分钟。

本文转自: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 
/* 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 
#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,内容如下:

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE    := hello_jniLOCAL_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工程。输出如下:

 

转载于:https://www.cnblogs.com/yongdaimi/p/7068353.html

你可能感兴趣的文章
《30天自制操作系统》学习笔记--第14天
查看>>
LGPL协议的理解
查看>>
1、Python基础
查看>>
Unity The Tag Attribute Matching Rule
查看>>
试着理解下kvm
查看>>
WebService学习总结(二)--使用JDK开发WebService
查看>>
Tizen参考手机RD-210和RD-PQ
查看>>
竞价广告系统-位置拍卖理论
查看>>
策略模式 C#
查看>>
[模板]树状数组
查看>>
[HDU 6447][2018CCPC网络选拔赛 1010][YJJ's Salesman][离散化+线段树+DP]
查看>>
设计模式学习的好方法
查看>>
感谢Leslie Ma
查看>>
几种排序方法
查看>>
查看数据库各表的信息
查看>>
第一阶段测试题
查看>>
第二轮冲刺第五天
查看>>
图片压缩
查看>>
Hadoop-2.6.5安装
查看>>
javaScript 实时获取系统时间
查看>>