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,工程代码为:
- package com.android.MyFirst;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.TextView;
- public class MyFirst extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- //setContentView(R.layout.main);
- TextView tv = new TextView(this);
- tv.setText( stringFromJNI() );
- setContentView(tv);
- }
- public native String stringFromJNI();
- static {
- System.loadLibrary("MyFirst");
- }
- }
之后,我们必须制作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文件,代码如下:
- #include <string.h>
- #include <jni.h>
- jstring
- Java_com_android_MyFirst_MyFirst_stringFromJNI( JNIEnv* env,
- jobject thiz )
- {
- return (*env)->NewStringUTF(env, "Hello from JNI !");
- }
注意,这个函数的参数与用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就可以运行了。