第一个NDK程序 MyFirstNDK_app

本文详细介绍首个NDK APP的开发全过程,从创建项目到配置NDK编译选项,直至运行应用。涵盖Android.mk、application.mk及hello-jni.c文件编写,并解决常见编译问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       本文分享自己第一个NDK APP程序的开发全过程,前提是Android SDK 和 NDK 已经正确地安装和配置。

       如何安装Android SDK , 参考:http://jingyan.baidu.com/article/d621e8da0999062865913f3b.html

       如何安装 NDK , 参考:http://jingyan.baidu.com/article/3ea51489e7a9bd52e61bbac7.html

       我使用NDK r10e版本,不同版本的NDK,使用JNI的方法有所不同。

       (1)下面开始新建一个android工程:

    取名随意,我取名为:MyFirstNDK_app。请注意设置 minSDK , targetSDK , 不可大意。

    (2)直接右键选中项目MyFirstNDK_app,新建一个 jni 文件夹

(3)编写 android.mk , application.mk 和 hello-jni.c , 完全自己新建有点麻烦,可以先导入ndk解压目录下面的samples\Hello-Jni项目,然后直接复制过来:

       到了这一步,尤其需要注意两个问题:

       1. 如果存在cpp文件,如下图

   

       HelloJni.cpp的文件名是我们自己项目的名称,注意修改;

       2. hello-jni.c 中函数名的意义:Java_包名_调用native方法的类名_native方法名,比如,我的函数名是:

                Java_com_example_myfirstndk_MainActivity_stringFromJNI

  (4)编写 MainActivity.java

package com.example.myfirstndk_app;

import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;


public class MainActivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        /* Create a TextView and set its content.
         * the text is retrieved by calling a native
         * function.
         */
        TextView  tv = new TextView(this);
        tv.setText( stringFromJNI() );
        setContentView(tv);
    }

    /* A native method that is implemented by the
     * 'hello-jni' native library, which is packaged
     * with this application.
     */
    public native String  stringFromJNI();

    /* This is another native method declaration that is *not*
     * implemented by 'hello-jni'. This is simply to show that
     * you can declare as many native methods in your Java code
     * as you want, their implementation is searched in the
     * currently loaded native libraries only the first time
     * you call them.
     *
     * Trying to call this function will result in a
     * java.lang.UnsatisfiedLinkError exception !
     */
    public native String  unimplementedStringFromJNI();

    /* this is used to load the 'hello-jni' library on application
     * startup. The library has already been unpacked into
     * /data/data/com.example.hellojni/lib/libhello-jni.so at
     * installation time by the package manager.
     */
    static {
        System.loadLibrary("hello-jni");
    }
}


  (5) 配置NDK的编译选项

        有好几种配置的方法,具体参考:http://www.cnblogs.com/skyseraph/p/3979238.html

        我采用的是第二种,不需要cygwin , 关键步骤截图如下:

      具体的配置:

         (6)右键点击项目 -> Android tools -> Add native support

     (7)右键点击项目->run as android application ,大功告成 !



 PS:有可能在编译过程中出现类似于 jnienv could not be resolved 的错误

    解决方法:
    是由于没有将jni.h导入的缘故,而这个文件在ndk的目录下面。所以,参照以下步骤:
Project Properties -> C/C++ General -> Path and Symbols
选择include标签,Add -> $Android_NDK_HOME/platforms/android-18/arch-arm/usr/include
其中,android-18是我自己采用的4.3的版本号,即target-version,这个因人而异。
且选中All languages.
最后Apply -> OK
这样错误就解决了。

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值