zoukankan      html  css  js  c++  java
  • 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就可以运行了。

  • 相关阅读:
    Python for i 循环
    Python 输入分数并评
    用户名和密码的输入
    cocos2d-x 3.0学习
    VS2008 ShotKey
    Cocos2d-x 3.0的安装方法
    VFC
    一、在WIN7 64位系统平台,VS2013环境下安装WTL90_4090_RC1(2014-04-01)
    http://www.vcf-online.org/
    Win7 64位 VS2012 安装 Qt5
  • 原文地址:https://www.cnblogs.com/sode/p/2886298.html
Copyright © 2011-2022 走看看