Chinaunix首页 | 论坛 | 博客
  • 博客访问: 152780
  • 博文数量: 47
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 405
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-23 14:38
文章分类

全部博文(47)

文章存档

2017年(7)

2016年(4)

2015年(19)

2014年(17)

我的朋友

分类: Android平台

2015-12-25 20:06:41

jni的好处勿用多说,下面直接看如何使用jni.
一般步骤为:在android主activity里加上:

点击(此处)折叠或打开

  1. package com.example.hellojni;

  2. import android.os.Bundle;
  3. import android.widget.TextView;
  4. import android.app.Activity;

  5. public class MainActivity extends Activity {

  6.     @Override
  7.     
  8.          public void onCreate(Bundle savedInstanceState)
  9.          {
  10.          super.onCreate(savedInstanceState);

  11.          /* Create a TextView and set its content.
  12.          * the text is retrieved by calling a native
  13.          * function.
  14.          */
  15.          TextView tv = new TextView(this);
  16.          tv.setText( stringFromJNI() );
  17.          setContentView(tv);
  18.          }

  19.          /* A native method that is implemented by the
  20.          * 'hello-jni' native library, which is packaged
  21.          * with this application.
  22.          */
  23.          public native String stringFromJNI();            //表示此为本地调用方法

  24.          /* this is used to load the 'hello' library on application
  25.          * startup. The library has already been unpacked into
  26.          * /data/data/com.example.hellojni/lib/libhello-jni.so at
  27.          * installation time by the package manager.
  28.          */
  29.          static {
  30.               System.loadLibrary("hello");             //hello为共享库libhello.so去头去尾的名称 
  31.          }
  32. }
接着在eclipse里直接run该android工程,得到相应的.class文件,或者在命令行生成。
获得.class文件后就要用javah获得相应的头文件,此头文件是供给c或c++代码使用。方法名必须与头文件里相同(确保jni能找到相应c方法)。使用javah容易出一个问题:

这时你首先要确定你是否将android.jar加入了CLASSPATH中。没有的话去你下载的android sdk的platforms下将其加入到CLASSPATH中。
完成后继续javah,如果还是报找不到类的错误。将路径改到src下。
此时就能正确生成头文件了。

点击(此处)折叠或打开

  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class com_example_hellojni_MainActivity */

  4. #ifndef _Included_com_example_hellojni_MainActivity
  5. #define _Included_com_example_hellojni_MainActivity
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10.  * Class: com_example_hellojni_MainActivity
  11.  * Method: stringFromJNI
  12.  * Signature: ()Ljava/lang/String;
  13.  */
  14. JNIEXPORT jstring JNICALL Java_com_example_hellojni_MainActivity_stringFromJNI
  15.   (JNIEnv *, jobject);

  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif
下面就是写C码了。

点击(此处)折叠或打开

  1. #include<jni.h>
  2. #include<stdio.h>
  3. #include<string.h>

  4. JNIEXPORT jstring JNICALL Java_com_example_hellojni_MainActivity_stringFromJNI
  5.   (JNIEnv *env, jobject obj){
  6.      return (*env)->NewStringUTF(env, "Hello from JNI !");
  7. }
然后添上mk文件就可以编译了。最终将生成的.so文件添加到安卓工程的libs/armeabi下,就能正常运行了。

阅读(1427) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~