Android Native Android Native Android Native Android Native

  • Slides: 25
Download presentation

Android Native开� Android Native � 用� 景 Android Native 开� 模式 Android Native 开�

Android Native开� Android Native � 用� 景 Android Native 开� 模式 Android Native 开� 具 JNI技�� 范

Android Native � 用� 景 Android的native开� ,什么� 候需要 Android的native开�� 来的�� Android的native 开� 的替代解决方案

Android Native � 用� 景 Android的native开� ,什么� 候需要 Android的native开�� 来的�� Android的native 开� 的替代解决方案

B:ndk�� ,目前支持之特定的API接口。 ● libc (C library) headers ● libm (math library) headers ● JNI

B:ndk�� ,目前支持之特定的API接口。 ● libc (C library) headers ● libm (math library) headers ● JNI interface headers ● libz (Zlib compression) headers ● liblog (Android logging) header ● Open. GL ES 1. 1 (3 D graphics library) headers (since 1. 6) ● A Minimal set of headers for C++ support 不管什么方式都要写makefile(mk)文件。

 Android Native 开� 具 GNUmakefile 3. 8. 1以上; 不同版本的gcc,g++; NDK,有限制;Android 源� ; java,c/c++,python;

Android Native 开� 具 GNUmakefile 3. 8. 1以上; 不同版本的gcc,g++; NDK,有限制;Android 源� ; java,c/c++,python; Bionic 仿生� , Gdb�� ;

 Native本地� ,load方式 (c/c++),文件后� 策略; load与非load方式; private native String get. Print. Str(); try {

Native本地� ,load方式 (c/c++),文件后� 策略; load与非load方式; private native String get. Print. Str(); try { System. load. Library("LIBNAME" } System. load. Library("FILENAME" } catch (Unsatisfied. Link. Error ule) { Log. e(TAG, "Could not load native library"); } 注意JNI会自�� 全lib和so� LIBNAME, 你只需要提供LIBNAME� load. Library就行了。 在最后� 行的� 候, JNI会先找到� 个��� , 然后找里面的On. Load函数, 具体注册流程 由On. Load函数接管; JNI Oload 与JNIUnload里面做的 作; ����� 接符号,注册函数,等

Java: private native String get. Print. Str(); Try { System. load. Library("LIBNAME"); //System. load(“FILENAME”);

Java: private native String get. Print. Str(); Try { System. load. Library("LIBNAME"); //System. load(“FILENAME”); } catch (Unsatisfied. Link. Error ule) { Log. e(TAG, "Could not load native library"); } 如果用System. load. Library函数加�� , JNI会自�� 全lib和so� LIBNAME, 你只需 要提供LIBNAME� load. Library就行了。在最后� 行的� 候, JNI会先找到� 个��� (在packagename/lib下面), 然后找里面的On. Load函数, 具体注册流程由On. Load函 数接管; 如果用System. load函数加�� , 你需要将整个� 文件的全路径告知System. load函 数;� 种适合� 文件放在用� 制定的位置。 C/C++:

*/* the JNI version on success, -1 on failure. */ jint JNI_On. Load(Java. VM*

*/* the JNI version on success, -1 on failure. */ jint JNI_On. Load(Java. VM* vm, void* reserved) { JNIEnv* env = NULL; jint result = -1; if (vm->Get. Env((void**) &env, JNI_VERSION_1_4) != JNI_OK) { LOGE("ERROR: Get. Env failed"); goto bail; } assert(env != NULL); if (!register_Test(env)) { LOGE("ERROR: Test native registration failed"); goto bail; } /* success -- return valid version number */ result = JNI_VERSION_1_4; bail: return result; }

int register_Test(JNIEnv *env) { const char* const Class. Path. Name = "com/android/xxx/test"; return register.

int register_Test(JNIEnv *env) { const char* const Class. Path. Name = "com/android/xxx/test"; return register. Native. Methods(env, Class. Path. Name, Test. Methods, sizeof(Test. Methods) / sizeof(Test. Methods[0])); } 映射表, 是Android使用的一种用于映射Java和C/C++函数的数� , � 个数 � 的� 型是JNINative. Method, 定�� : typedef struct { const char* name; const char* signature; void* fn. Ptr; } JNINative. Method; 第一个� 量是Java代� 中的函数名称。第二个� 量是� 函数�� 的 Native signature。第三个� 量是� 函数�� 的Native函数的函数指� ;

Java 和Jni数据� 型映射 字符 Java� 型 C� 型 V void Z jboolean I jint

Java 和Jni数据� 型映射 字符 Java� 型 C� 型 V void Z jboolean I jint J jlong D jdouble F jfloat B jbyte C jchar S jshort 数�� 以"["开始,用两个字符表示 [I jint. Array int[] [F jfloat. Array float[] [B jbyte. Array byte[] [C jchar. Array char[] [S jshort. Array short[] [D jdouble. Array double[] [J jlong. Array long[] [Z jboolean. Array boolean[]

�� : 分完整源�� 境以及NDK。两种� 境�� 的Log� 出方式也并不相同, 差异� 主要体� 在需要包含 的� 文件中。如果是在完整源���� 境下, 只要include

�� : 分完整源�� 境以及NDK。两种� 境�� 的Log� 出方式也并不相同, 差异� 主要体� 在需要包含 的� 文件中。如果是在完整源���� 境下, 只要include <utils/Log. h>� 文件(位于Androidsrc/system/core/include/cutils), 就可以使用�� 的LOGI、LOGD等方法了, 当然 LOG_TAG, LOG_NDEBUG等宏� 需要自定� 。 如果是在NDK� 境下�� , � 需要include <android/log. h>� 文件(位于ndk/android-ndk-r 4/ platforms/android-8/arch-arm/usr/include/android/), 另外自己定� 宏映射, 例如: #include <android/log. h> #ifndef LOG_TAG #define LOG_TAG "MY_LOG_TAG" #endif #define LOGD(. . . ) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) #define LOGI(. . . ) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) #define LOGW(. . . ) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__) #define LOGE(. . . ) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) #define LOGF(. . . ) __android_log_print(ANDROID_LOG_FATAL, LOG_TAG, __VA_ARGS__) 在Android. mk文件中��� 的� 用在两种� 境下也不相同。如果是NDK� 境下, 需要包括 LOCAL_LDLIBS : = -llog 而在完整源�� 境下, � 需要包括 LOCAL_SHARED_LIBRARIES : = libutils libcutils