Android JNI开发实践教程与hello-jni示例分析

版权申诉
0 下载量 101 浏览量 更新于2024-11-10 收藏 130KB ZIP 举报
资源摘要信息:"该文件名为 'hello-jni_jni_android_',内容涉及Android平台上的JNI(Java Native Interface)技术,旨在展示如何在Android应用中使用JNI进行Java代码和本地代码(如C或C++代码)的交互。JNI是Java平台提供的一套编程框架,允许Java代码和其他语言编写的代码进行交互。在这个示例中,'hello-jni' 通常指的是一个Android项目或代码示例,它演示了如何创建和运行一个简单的JNI应用。" 知识点: 1. JNI简介: JNI是Java Native Interface的缩写,它是Java平台的一部分,用于实现Java代码与本地应用程序接口(如C、C++和汇编语言)之间的交互。JNI允许Java虚拟机(JVM)中的Java代码调用本地应用程序接口(API)的函数,同时也允许本地代码调用Java虚拟机中的方法和对象。 2. Android与JNI: 在Android平台上,JNI扮演了非常关键的角色。Android应用通常使用Java或Kotlin编写,但为了提高性能或利用现有的本地代码库,开发者经常需要使用JNI来编写或调用本地代码。Android系统中的许多系统服务和库都是通过JNI接口与Java层通信的。 3. JNI环境的设置: 开发者需要在Android Studio中配置CMake或ndk-build来构建本地代码,因为Android应用运行在Dalvik虚拟机或Android运行时(ART)上。配置环境的步骤包括创建一个CMakeLists.txt或Android.mk文件来指定如何构建本地代码库。 4. JNI方法的声明和调用: 在Java类中声明native方法时,需要使用native关键字标记。当Java虚拟机调用一个native方法时,它通过JNI查找对应的本地方法并调用。本地方法通常遵循特定的命名约定,以确保JNI可以正确找到并链接。 5. JNI数据类型和转换: JNI定义了一系列的数据类型和签名,用于描述Java数据类型与本地数据类型之间的映射关系。开发者需要了解如何在Java和本地代码之间转换基本数据类型、引用类型以及如何处理数组和字符串。 6. 加载和卸载本地库: 在Android应用中加载本地库通常是通过System.loadLibrary()方法实现的。此方法需要传入不带前缀"lib"和后缀".so"的库名。同时,开发者应确保在适当的时候卸载不再需要的库,以避免资源泄露。 7. JNI的最佳实践: 使用JNI进行开发时,开发者应当遵循一些最佳实践,比如减少JNI层代码的使用,避免不必要的本地方法调用,以及使用清晰和高效的本地方法实现。同时,应当注意线程安全问题,确保在多线程环境下正确处理本地资源。 8.JNI在Android应用中的优势与劣势: JNI可以提供Java代码无法实现的功能,例如使用硬件加速、优化性能或访问特定硬件接口。然而,使用JNI也可能增加应用的复杂性,降低可维护性,并可能导致应用性能下降。正确地管理和使用JNI是非常重要的。 通过以上的知识点分析,可以看出'hello-jni_jni_android_'文件不仅仅是一个简单的示例程序,它所代表的概念和实现技巧是Android开发中不可或缺的一部分。掌握JNI的使用对于任何希望深入Android系统底层开发的开发者来说都是必不可少的技能。
2012-11-16 上传
1. linux下jni环境搭建 参考:http://blog.csdn.net/zhouyuanjing/article/details/7553706 2. 编写HelloJni工程,在主Activity(本例:HelloJni.java)里声明native函数: 如下: public native String stringFromJNI(); public native double add(double a, double b); public native double sub(double a, double b); public native double multi(double a, double b); public native double div(double a, double b); static { System.loadLibrary("hello-jni"); } 3. 在根目录下创建 jni 目录(mkdir jni). 4. 利用命令生成相应的头文件,在根目录下执行:javah -classpath bin/classes -d jni com.xxx.hello.HelloJni ————————————— ——————— ^ ^ 包名 类名 5. 编写相应的.c文件(hello-jni.c) #include<string.h> #include<jni.h> JNIEXPORT jstring JNICALL Java_com_xxx_hello_HelloJni_stringFromJNI(JNIEnv *env, jobject obj) { return(*env)->NewStringUTF(env, "Hello World from JNI !"); } JNIEXPORT jdouble JNICALL Java_com_xxx_hello_HelloJni_add(JNIEnv *env, jobject obj, jdouble a, jdouble b) { return a + b; } JNIEXPORT jdouble JNICALL Java_com_xxx_hello_HelloJni_sub(JNIEnv *env, jobject obj, jdouble a, jdouble b) { return a - b; } JNIEXPORT jdouble JNICALL Java_com_xxx_hello_HelloJni_multi(JNIEnv *env, jobject obj, jdouble a, jdouble b) { return a * b; } JNIEXPORT jdouble JNICALL Java_com_xxx_hello_HelloJni_div(JNIEnv *env, jobject obj, jdouble a, jdouble b) { return a / b; } 6. jni目录下编写Android.mk文件 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY) 在根目录下运行:ndk-build xxx@xion-driver:~/android_env/eclipse/Workspace/HelloJni$ndk-build Install : libhello-jni.so => libs/armeabi/libhello-jni.so 可以看到已经正确的生成了libhello-jni.so共享库了。 7. Eclipse运行该工程即可。 ~~完~~