ANDROID NDK 开发 HelloWorld

NDK的全称是 Native Development Kit,NDK提供了一系列工具来帮助开发者快速开发 C/C++ 的动态库,并能自动将so和Java应用一起打包成apk。 

1. 确认Android开发环境

使用标准Eclipse, 安装Android的环境。例如我的android开发环境如下:

Eclipse Version: Mars.2 Release (4.5.2) 
Android SDK: Android 6.0 (API level 23) 
ADT Version: 23.0.4.1468518

2. 下载ndk,在eclipse中设置路径

下载ndk,解压。我的ndk版本:android-ndk-r10b。 
然后打开Eclipse,点Window->Preferences->Android->NDK,设置NDK路径为刚才ndk解压路径

3. 创建接口类

先按通常的步骤,建立一个android的helloWorld工程,验证其可运行。 
在这个包下面,新建一个JniClient 类。在里面声明一个接口(后期开发,可以继续添加新的接口):

static public native String sayHello();
 
 
  • 1

4. 配置Android项目的NativeSupport

右键点击项目,在Android Tools里面点击Add NativeSupport, 指定库名。注意命名库名是有限制的,不能有下划线“_”,因为下划线“_”是jni中函数名分割的标识。而我曾经用hello_world做为库名,恰好中招,掉入坑中好久爬不出来。现在我使用默认的库名“HelloWorld”,点击确认。 
这样就会自动生成:HelloWorld.cpp和Android.mk。 
Android.mk不需要修改。

5. 修改HelloWorld.cpp,实现接口功能

代码如下:

#include <jni.h>
extern "C" {
JNIEXPORT jstring JNICALL 
Java_com_example_helloworld_JniClient_sayHello(JNIEnv *env, jclass)
{
    return env->NewStringUTF("Hello JNI!");
}
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

注意两点: 
(1) C/C++定义的方法必须为:Java+包名+activity名+你的函数名,每个部分之间要用下划线_来连接, 而且参数也是固定的。所以定义C/C++函数的固定格式为: 
Java_PackageName_ActivityName_function(JNIEnv* env, jobject obj) {…} 
(2)此处的 extern “C” ,是必需的。不添加会遇到运行时崩溃。

6. 修改主程序,调用接口

原来的程序在运行时,默认的输出为“HelloWorld”。现在来修改输出,使用cpp中的返回内容。 
在res->layout->activity_main.xml中, 为TextView添加id, 然后在java代码中调用, 其他不做修改。 
xml中添加id:

android:id="@+id/tv_say_hello"
 
 
  • 1

MainActivity.java中,动态赋值:

        TextView tv_say_hello = (TextView) findViewById(R.id.tv_say_hello);
        tv_say_hello.setText(JniClient.sayHello());
 
 
  • 1
  • 2

其次, 添加库的引用, 引用名字就是Add NativeSupport时填写的类名, 默认与项目名称相同。也可以查看Android.mk下LOCAL_MODULE对应的值。例如我的就是:

LOCAL_MODULE    := HelloWorld
 
 
  • 1

添加如下代码:

    static {
        System.loadLibrary("HelloWorld");
    }
 
 
  • 1
  • 2
  • 3

7. 进行工程编译,运行程序

若前面设置都正常,此时就能编译出libHelloWorld.so了。 
在eclipse的Console里面输出信息:

[armeabi] Compile++ thumb: HelloWorld <= HelloWorld.cpp 
[armeabi] StaticLibrary : libstdc++.a 
[armeabi] SharedLibrary : libHelloWorld.so 
[armeabi] Install : libHelloWorld.so => libs/armeabi/libHelloWorld.so

若在模拟器上运行,需要有在x86上运行的库,则需要添加Application.mk,否则不能编译其他几个平台下的.so库 
Application.mk里面只有一句话:

APP_ABI := all
 
 
  • 1

正常编译后,运行效果就是TextView的输出内容变为“Hello JNI!”。

8. Demo下载

代码例程可以从以下地址下载: 

http://download.csdn.net/download/lihaoxiang123/10225538

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值