android ndk webview,Android NDK初探 你也可以做移动开发

51CTO曾介绍Android开发WebView组件的使用详解,本文将为各位详细介绍Android NDK的安装、使用和实战。我下载的是Android Native Developer Kit (NDK) R4版本,当前的最新版。

ef1cea67dd1fda5585c77b9e1f2313ee.pngAndroid NDK

下载地址如下: http://dl.google.com/android/ndk/android-ndk-r4b-linux-x86.zip

我下面讲的都是以linux环境为准,因为我的系统是linux的。windows下可以弄个Cygwin,模拟linux环境。

首先进入NDK目录,有个README文件,里面提到了API的文档在docs/STABLE-APIS.TXT里面,如何安装NDK,参考docs/INSTALL.TXT,还有如何使用NDK,参考docs/HOWTO.TXT。建议这些文档都看一遍,有个大概了解。

安装:

INSTALL.TXT里面讲的是如何安装,安装NDK,就需要一个可以make环境,linux自带了,所以不用关心。还有一点,以前的版本都需要运行build/host-setup.sh来进行初始化,这个版本把它删除了,这样更方便。

然后就是配置环境变量。

在~/.bashrc文件里面,添加Shell代码

NDK_ROOT=~/android-ndk-r4b #后面的路径是NDK所在的目录,根据自己的目录修改  export NDK_ROOT

然后保存,重新打开bash。

使用:

先拿sample试刀吧,刚开始什么都不知道,只有运行出一个例子,才能增加信心。

编译的两种方法:

1.进入要目标工程目录,比如$NDK_ROOT/samples/hello-jni,然后执行$NDK_ROOT/ndk-build

2.在任何地方,执行$NDK_ROOT/ndk-build -C $NDK_ROOT/samples/hello-jni.

如果成功的话,会生成obj和libs两个目录。

选择一种方法,编译这个例子。然后打开eclipse,把hello-jni这个工程导入,运行,ok,就能看到效果了。

进阶:

docs下的STABLE-APIS.TXT里面讲了系统API的用法。我以1.5为例。进入$NDK_ROOT/build/platforms/android-3/arch-arm/usr/include,里面有很多.h文件,这些都是可以在NDK里面调用的,除了linux和asm目录下的。

一般来说,主要用到的是jni.h,里面提供了很多对类和对象的操作。

另外,1.5提供了log的API,在android/log.h里面,使用的时候,在c文件中#include ,然后在Android.mk里面加上LOCAL_LDLIBS := -llog,就可以了。

1.6到2.01提供了openGL ES 1.x的API,2.1提供了openGL ES 2.0的API,2.2提供了graphics的处理接口。使用方法同log。

实例:

给出两个点的坐标,求它们的距离。

首先,创建一个Point对象,

Java代码

public class Point {

float x;

float y;

}

然后在c文件中定义一个函数

C代码

jfloat Java_chroya_demo_ndk_Main_distance(JNIEnv* env, jobject thiz, jobject a,jobject b){}

返回值是float,在jni中定义的是jfloat。

函数名规则: Java开头,接着是包名的每一段,然后是类名,最后是Java中调用的方法名,中间都用下划线隔开。第一个参数JNIEnv* env和第二个参数jobject thiz都是必须的,后面的才是Java中传递进来的参数。这里是两个Point对象。

首先确定要做的步骤:

◆找到这个Point类

◆找到类中的域x和y的域id

◆根据ID取出x和y的值

◆计算结果并返回

那么代码如下:

Java代码

#include

#include

#include

jfloat Java_chroya_demo_ndk_Main_distance(JNIEnv* env, jobject thiz, jobject a,jobject b)

{

//步骤1

jclasspoint_class= (*env)->FindClass(env, "chroya/demo/ndk/Point");

if(point_class== NULL) {

//printf("class not found");

__android_log_write(ANDROID_LOG_INFO, "MyNdkDemo", "class Point not found");

return 0;

} else {

__android_log_write(ANDROID_LOG_INFO, "MyNdkDemo", "found class Point");

}

//步骤2

jfieldIDfield_x= (*env)->GetFieldID(env, point_class, "x", "F");

jfieldIDfield_y= (*env)->GetFieldID(env, point_class, "y", "F");

//步骤3

jfloatax= (*env)->GetFloatField(env, a, field_x);

jfloatay= (*env)->GetFloatField(env, a, field_y);

jfloatbx= (*env)->GetFloatField(env, b, field_x);

jfloatby= (*env)->GetFloatField(env, b, field_y);

//步骤4

return sqrtf(powf(bx-ax, 2) + powf(by-ay, 2));

}

然后在Java里面调用:

Java代码

public class Main extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

TextViewtv=newTextView(getApplicationContext());

Pointa=newPoint();

a.x=3;

a.y=3;

Pointb=newPoint();

b.x=5;

b.y=5;

floatd=distance(a,b);

tv.setText("distance(a,b):"+d);

setContentView(tv);

}

public native float distance(Point a, Point b);

static {

System.loadLibrary("demo");

}

}

运行,得到结果distance(a,b):2.828427

源码参见附件 。

【编辑推荐】

【责任编辑:立方 TEL:(010)68476606】

点赞 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android NDK开发是指利用NDK(Native Development Kit)将C/C++开发的代码编译成so库,然后通过JNI(Java Native Interface)让Java程序调用。在Android开发中,默认使用的是Android SDK进行Java语言的开发,而对于一些需要使用C/C++的高性能计算、底层操作或跨平台需求的场景,可以使用NDK进行开发。 在Android Studio中进行NDK开发相对于Eclipse来说更加方便,特别是在Android Studio 3.0及以上版本中,配置更加简化,并引入了CMake等工具,使得开发更加便捷。首先要进行NDK开发,需要配置环境,包括导入NDK、LLDB和CMake等工具。可以通过打开Android Studio的SDK Manager,选择SDK Tools,在其中选中相应的工具进行导入。 在项目的build.gradle文件中,可以配置一些NDK相关的参数,例如编译版本、ABI过滤器等。其中,可以通过externalNativeBuild配置CMake的相关设置,包括CMakeLists.txt文件的路径和版本号。此外,在sourceSets.main中还可以设置jniLibs.srcDirs,指定so库的位置。 在进行NDK开发时,可以在jni文件夹中编写C/C++代码,并通过JNI调用相关的函数。通过JNI接口,可以实现Java与C/C++之间的相互调用,从而实现跨语言的开发。 综上所述,Android NDK开发是指利用NDK将C/C++开发的代码编译成so库,并通过JNI实现与Java的相互调用。在Android Studio中进行NDK开发相对方便,可以通过配置环境和相应的参数来进行开发。<span class="em">1</span><span class="em">2</span><span class="em">3</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值