android+NDK 入门备忘 ubuntu 11.10

4 篇文章 0 订阅
2 篇文章 0 订阅

使用NDK时的大致步骤如下:

1.  新建一个Android 工程,在里面新建一个jni 文件夹,专门用来存放 C 语言程序和Android.mk 文件;

2.  在java文件中编写一个 native 函数: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package  tangyuchun.ndk.hellojni;
 
import  android.app.Activity;
import  android.os.Bundle;
import  android.widget.TextView;
 
public  class  HellojniActivity  extends  Activity {
     static  {
         System.loadLibrary( "hello-jni" );
     }
 
     public  native  static  String getString();
 
     public  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
 
         TextView tv =  new  TextView( this );
         tv.setText(getString()); // 调用了native方法
         setContentView(tv);
     }
}


这里是一个简单的Activity界面,里面定义了一个 getString()方法,用来获取一个字符串。

3.  打开终端,使用 javah -classpath 命令编译 bin/classes 下生成的 .class文件。我的命令如下:

1
2
javah -classpath  /home/administrator/android_code/hello-jni/bin/classes 
tangyuchun.ndk.hellojni.HellojniActivity

可以在src的 .java 源代码中使用同样的命令: 

1
2
javah -classpath  /home/administrator/android_code/hello-jni/src 
tangyuchun.ndk.hellojni.HellojniActivity

记得在前面要加上包名(我的是在tangyuchun.ndk.hellojni 这个包下面)。

 4.  经过第3步后,就会在该类目录下生成一个 .h 的头文件(ubuntu也有可能生成在主文件夹下面),名字为 

    tangyuchun_ndk_hellojni_HellojniActivity.h,打开这个头文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <jni.h>
/* Header for class tangyuchun_ndk_hellojni_HellojniActivity */
 
#ifndef _Included_tangyuchun_ndk_hellojni_HellojniActivity
#define _Included_tangyuchun_ndk_hellojni_HellojniActivity
#ifdef __cplusplus
extern  "C"  {
#endif
/*
  * Class:     tangyuchun_ndk_hellojni_HellojniActivity
  * Method:    getString
  * Signature: ()Ljava/lang/String;
  */
JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString
   (JNIEnv *, jclass);
 
#ifdef __cplusplus
}
#endif
#endif


 5. 看到里面有一个函数: JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString(JNIEnv *, jclass);

    这个方法就与第2步的getString()对应。

6.  在jni 文件夹中新建一个 c语言文件,我的是 hello-jni.c ,include相应的头文件,然后将第4步中的那个方法复制,完成该方法:

1
2
3
4
5
6
7
8
9
10
11
#include <string.h>
#include <stdio.h>
#include <android/log.h>
#include <stdlib.h>
#include <jni.h>
 
JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString(
   JNIEnv *env, jclass thiz) {
  return  (*env)->NewStringUTF(env,  "Some say love" );
         //这里只是做个样例,所以只让他返回一段字符串 "Some say love"
}

注意,要给方法添加参数,头文件中只是声明,并没有实参。

7.  同样,在 jni 文件夹下面新建一个 Android.mk 文件,内容如下:

1
2
3
4
5
6
7
8
LOCAL_PATH := $(call my-dir)
 
include $(CLEAR_VARS)
 
LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c
 
include $(BUILD_SHARED_LIBRARY)

那个LOCAL_MODULE 就是将要生成的.so 文件名,LOCAL_SRC_FILES就是第6步中编写的 .c 文件。

8.  保存上述文件,打开终端,定位到工程的目录下的jni 文件夹,在终端输入: ndk-build 命令,回车。

9.  返回到工程文件夹下,就会看到生成了两个文件夹 libs 和 obj,其中 libs/armeabi/ 文件夹下面就有 一个 libhello-jni.so 文件,这

个.so文件其实就是用来在android中调用C语言的类库;

10. 在Android虚拟机上运行上面建立的工程,如下所示:

                                                       

              


-------------------2012-07-22 23:58:00

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值