android ndk

引用:http://www.eoeandroid.com/thread-36532-1-1.html

我是一个在windows平台混惯了的程序员,现在想移植到手机平台,于是乎下了一个NDK,准备制作自己的本地库,然后调用,虽然说JNI在android中分量没那么重,但是也提供了一个方法给C/C++程序员使用。这里发表一下自己的心得,给大家一点参考。
下了NDK,首先详细阅读了OVERVIEW.TXT、ANDROID-MK.TXT和APPLICATION.TXT文档,这些文档教你如何使用NDK,怎么制作APPLICATION.MK和ANDROID.MK文件,必看!如何安装NDK在网上或者INSTALL.TXT有详细说明,这里就不介绍了。然后参看其中做好.so的例子,在APPS目录下。现在开始进入正题,如何制作.so本地库文件呢?网上有一篇利用VC 6.0 实现 JNI的文章,链接为:http://www.360doc.com/content/06/0701/13/9817_146684.shtml#
参考了这篇文章之后,就试着自己做.so文件并在模拟器上运行。
首先,用Eclipse建立一个ANDROID的工程,命名为MyFirst,工程代码为:

  1. package com.android.MyFirst;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.widget.TextView;
  5. public class MyFirst extends Activity {
  6.     /** Called when the activity is first created. */
  7.     @Override
  8.     public void onCreate(Bundle savedInstanceState) {
  9.         super.onCreate(savedInstanceState);
  10.         //setContentView(R.layout.main);
  11.         TextView  tv = new TextView(this);
  12.         tv.setText( stringFromJNI() );
  13.         setContentView(tv);
  14.     }
  15.     public native String  stringFromJNI();
  16.     
  17.     static {
  18.         System.loadLibrary("MyFirst");
  19.     }
  20. }
复制代码


之后,我们必须制作MyFirst这个so文件,可是还差一个.c文件没有实现,因此我们必须制作.c文件,相关函数申明从哪里来?看过前面那个链接的朋友可能就会想到了,我们可以获取以.h文件,通过这个文件获取函数申明。
打开命令行,键入cd (这个路径是使用Eclipse建立的工程目录的src的路径),目的是设置工程目录。然后键入:javah -jni com.android.MyFirst.MyFirst ,结果如果失败,那就是因为没有把MyFirst.class文件拷贝到D:\MyProgram\JavaProjects\MyFirst\src\com\android\MyFirst之下,原因是Eclipse的文件管理机制会将.class文件和.java文件分开到不同的目录,解决方法是将D:\MyProgram\JavaProjects\MyFirst\bin\com\android\MyFirst的所有.class文件都拷贝到他的目录下面。再次运行javah -jni com.android.MyFirst.MyFirst 即可。然后就可以看到在D:\MyProgram\JavaProjects\MyFirst\src下多出了一个文件:com_android_MyFirst_MyFirst.h,通过这个文件,我们就知道了本地接口的函数名,于是我们就根据函数名写一个.c文件,代码如下:

  1. #include <string.h>
  2. #include <jni.h>
  3. jstring
  4. Java_com_android_MyFirst_MyFirst_stringFromJNI( JNIEnv* env,
  5. jobject thiz )
  6. {
  7. return (*env)->NewStringUTF(env, "Hello from JNI !");
  8. }
复制代码


注意,这个函数的参数与用javah生成出来的参数是不同的,这里只是需要函数名而已,因为函数名必须匹配,否则在模拟器上面跑的时候会出错,当然,如果对JNI命名规则熟悉的话可以跳过javah这步,直接写一个.c文件。
写好.c文件之后就开始生成.so文件了,这时候需要上面提到过的APPLICATION.MK和ANDROID.MK这两个文件。于是把Eclipse生成的工程目录剪切,放到NDK目录的apps目录之下(和示例hello-jni一样),这个时候模仿hello-jni文件层次结构,将MyFirst文件也做成那样,可以参考上传的源码。完成之后,我们开始在cygwin中输入:make APP=MyFirst,如果出现下面的错误说明你快要成功了:
$ make APP=MyFirst
Android NDK: Application MyFirst targets platform 'android-8'
Android NDK: which is not supported by this release of the Android NDK
build/core/add-application.mk:76: *** Android NDK: Aborting...    .  Stop.
因为你使用的是2.2版本的SDK所以检查的时候有问题,做法是:除了将jni文件目录保留,别的文件和目录都剪切到别的地方,然后再make APP=MyFirst
成功之后,再把这些前面的东西拷贝回来。
最后,将这个工程导入Eclipse就可以运行了。

posted @ 2013-01-31 08:37  镇水古月  阅读(182)  评论(0编辑  收藏  举报