相信Android开发者都喜欢用C++编写一些高效的应用,有关Android NDK的C++开发相关知识Android123总结如下: 1. 从Android NDK r5开始支持了STL Port,在这个版本开始就可以使用部分STL库的功能了,比如说vector、string摆脱c下面容易出现的数组未初始化、越界,增强应用的健壮性。 2. 很多网友包含了include <vector> 这样头,但仍然无法编译,这里你首先要检查当前文件是否为.cpp后缀,同时为了使用标准库必须加入 APP_STL := stlport_static 在Application.mk文件中。相关对应还有 system 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持 stlport_static 使用STLport作为静态库,这项是Android开发网极力推荐的 stlport_shared STLport 作为动态库,这个可能产生兼容性和部分低版本的Android固件,目前不推荐使用。 gnustl_static 使用 GNU libstdc++ 作为静态库 默认情况下STLPORT是不支持C++异常处理和RTTI,所以不要出现 -fexceptions 或 -frtti ,如果真的需要可以使用gnustl_static来支持标准C++的特性,但生成的文件体积会偏大,运行效率会低一些。 3. 支持C++异常处理,在Application.mk中加入 LOCAL_CPPFLAGS += -fexceptions这句,同理支持RTTI,则加入LOCAL_CPPFLAGS += -frtti,这里Android123再次提醒大家,第二条说的使用gnustl静态库,而不是stlport 4. 强制重新编译 STLPort ,在Application.mk中加入 STLPORT_FORCE_REBUILD := true 可以强制重新编译STLPort源码,由于一些原因可能自己需要修改下STLPort库,一般普通的开发者无需使用此项。 5 Android目前最新的NDK版本为r6,相关的学习可以查看NDK中的Samples整体和在PC上开发没有太大的不同。
NDK
Android NDK开发技巧一 Android开发技术
平时我们开发Android应用时可能部分要求由于性能问题需要使用NDK来实现,比如OpenGL、OpenCore这样的多媒体应用,使用本地C/C++语言可以处理一些性能敏感或复杂的算法,Android123就我们日常NDK开发中遇到的问题以及技巧逐一总结方便网友查阅。 1. Android NDK编译的应用可以运行在Android 1.5或更高的操作系统上,在Android平台中本地调用主要通过JNI方式处理,JNI调用开销不小如果很简单的操作没有必要画蛇添足。 2. 一般NDK生成的so文件如何打包到apk中去呢?一般工程目录下创建一个libs文件夹,当然了手动释放也可以比如说 data/data/cn.com.android123.cwj/files/rmvb-decoder.so 3. 在JNI下面,我们常用的命名方式: static JavaVM *g_VM; //全局环境指针 static jclass jNativesClass; (*env)->GetJavaVM(env, &g_VM); //获取env环境指针,这样以后用g_VM就可以了。 4. jobjectArray jargv // java数组 int getArrayLen(JNIEnv * env, jobjectArray jarray): //获取一个Java数组长度,返回为jsize类型 jstring jele = (jstring)(*env)->GetObjectArrayElement(env, jargv, n); //从将Java数组元素n转为本地的jstringconst char *word = (*env)->GetStringUTFChars(env, jele, 0); //将java的utf字符转为c下面的char* 5. […]
NativeActivity类在NDK中管理Activity Android开发技术
在Android 2.3中Google开始逐渐的放宽NDK功能,新增的NativeActivity类允许Android开发者使用C/C++在NDK环境中处理Activity的生命周期。不过Android123提醒从继承关系来看NativeActivity是Activity的子类。要使用该功能,我们必须声明一些内容: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.native_activity" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="9" /> <application android:label="@string/app_name" android:hasCode="false"> <activity android:name="android.app.NativeActivity" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden"> <meta-data android:name="android.app.lib_name" android:value="native-activity" /> //android.app.lib_name是so文件的名字 <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 有关如何在NDK中实现来自SDK代码,源码如下包含了使用本地语言处理感应器Sensor: #include <jni.h>#include <errno.h> #include <EGL/egl.h>#include <GLES/gl.h> #include <android/sensor.h>#include <android/log.h>#include <android_native_app_glue.h> #define LOGI(…) ((void)__android_log_print(ANDROID_LOG_INFO, "native-activity", __VA_ARGS__))#define LOGW(…) ((void)__android_log_print(ANDROID_LOG_WARN, […]
Android NDK之JNI使用例子 Android开发技术
目前Android NDK只能编译出动态库.so文件,并不是能生成.apk文件,这里我们简单介绍下NDK中的Hello JNI列子。整个例子分Java和Native C两个部分。首先是我们常用的Java端调用部分。 package com.example.hellojni; import android.app.Activity;import android.widget.TextView;import android.os.Bundle; public class HelloJni extends Activity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText( stringFromJNI() ); //如果调用失败将会抛出 java.lang.UnsatisfiedLinkError异常 setContentView(tv); } //注意下面的native关键字 public native String stringFromJNI(); public native String unimplementedStringFromJNI(); static { System.loadLibrary("hello-jni"); //载入hello-jni库 } } 需要注意的是这里必须设置SDK版本为1.5或以上版本即在androidmanifest.xml文件中指明<uses-sdk […]

