1. 云栖社区>
  2. 博客列表>
  3. 正文

android图文介绍NDK安装及简单jni demon的实现

傲海 2014-03-14 09:38:00 浏览253 评论0

android native 函数 c++ shell string jni source

摘要: (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景      android NDK可以用来编译android的native方法,也可以将c和c++的代码编译成.so文件,让android程序运行。 2.NDK安装(linux环境)    (1)下载对应的ndk版本,在shell里输入如下命令          gedit ~/.

(转载请注明出处:http://blog.csdn.net/buptgshengod

1.背景

     android NDK可以用来编译android的native方法,也可以将c和c++的代码编译成.so文件,让android程序运行。

2.NDK安装(linux环境)

   (1)下载对应的ndk版本,在shell里输入如下命令

        

gedit ~/.bashrc

     (2)打开bash文件,添加下载的ndk路径

NDKROOT=/home/CORPUSERS/28852262/android-ndk-r9c
export PATH=$NDKROOT:$PATH

   (3)输入如下命令,然后重启shell

source /etc/profile

   (4)在shell中输入ndk-build,出现如下状态说明安装成功

3.jni第一个demon helloworld

      (1)编写hello-jni.c文件。

#include <string.h>
#include <jni.h>

/* This is a trivial JNI example where we use a native method
 * to return a new VM String. See the corresponding Java source
 * file located at:
 *
 *   apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java
 */
jstring
Java_com_example_hellojni_HelloJni_aa( JNIEnv* env,
                                                  jobject thiz )
{
#if defined(__arm__)
  #if defined(__ARM_ARCH_7A__)
    #if defined(__ARM_NEON__)
      #define ABI "armeabi-v7a/NEON"
    #else
      #define ABI "armeabi-v7a"
    #endif
  #else
   #define ABI "armeabi"
  #endif
#elif defined(__i386__)
   #define ABI "x86"
#elif defined(__mips__)
   #define ABI "mips"
#else
   #define ABI "unknown"
#endif

    return (*env)->NewStringUTF(env, "Hello from JNI !  Compiled with ABI " ABI ".");
}

这个c文件实现输出一个string型函数,注意这里

Java_com_example_hellojni_HelloJni_aa
我们创建android应用的时候包和函数命名要和这个对应,否则汇报错:native method is not found。如下图



(2)编写android.mk文件,我会把相关资源上传

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

(3)注意文件夹名要是jni,否则ndk不识别

(4)shell中进入相关路径下面执行

ndk-build
 

(5)将生成的libs文件和已经编号的jni导入工程

(6)看下主程序代码,注意注释

public class HelloJni extends Activity {

    TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hello_jni);



    tv=(TextView)findViewById(R.id.textView1);

    Button bt2 = (Button)findViewById(R.id.button1);

    bt2.setOnClickListener(new Button.OnClickListener()
    {
      @Override
      public void onClick(View v)
      {
          tv.setText(aa());
      }
    });
}

public native String  aa();//native方法,对应c文件Java_com_example_hellojni_HelloJni_aa中的aa


static {

    System.loadLibrary("hello-jni");//注意名字是是libhello-jni.so去掉lib和后缀

}
}

(7)效果

点击按钮:出现一串话



最后把工程上传,我的工程是公司的sdk,所以大家用的时候要换成自己的。lib和jni都是通用的,have fun!


资源下载:http://download.csdn.net/detail/gshengod/7034015


本文为云栖社区原创内容,未经允许不得转载,如需转载请发送邮件至yqeditor@list.alibaba-inc.com;如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:yqgroup@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

用云栖社区APP,舒服~

【云栖快讯】红轴机械键盘、无线鼠标等753个大奖,先到先得,云栖社区首届博主招募大赛9月21日-11月20日限时开启,为你再添一个高端技术交流场所  详情请点击

网友评论

关注
傲海
著有《机器学习实践应用》,阿里云机器学习PAI...
282篇文章|687关注
阿里云移动APP解决方案,助力开发者轻松应对移动app中随时可能出现的用户数量的爆发式增长、复杂的移动安全挑战等... 更多>

移动测试(Mobile Testing)是为广大企业客户和移动开发者提供真机测试服务的云平台,拥有大量热门机型,... 更多>

基于大数据的移动云服务。帮助App快速集成移动推送的功能,在实现高效、精确、实时的移动推送的同时,极大地降低了开... 更多>

为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本... 更多>
MaxCompute75折抢购

MaxCompute75折抢购