`

Android JNI开发入门

 
阅读更多

JNI在Android开发中使用的比较广泛,因为Android应用层是用Java实现,底层是c/c++实现的,所以应用层调用底层库时需要使用JNI。如果你熟悉java和c/c++的话,那么学习JNI主要需要掌握java和c/c++数据类型的转换、JNI语法和函数编写规则。下面首先介绍java基本类型和引用类型跟JNI本地相关类型的对照,然后完成一个简单的demo。

1. 对照表

Java类型 本地类型 描述
boolean jboolean C/C++8位整型
byte jbyte C/C++带符号的8位整型
char jchar C/C++无符号的16位整型
short jshort C/C++带符号的16位整型
int jint C/C++带符号的32位整型
long jlong C/C++带符号的64位整型e
float jfloat C/C++32位浮点型
double jdouble C/C++64位浮点型
Object jobject 任何Java对象,或者没有对应java类型的对象
Class jclass Class对象
String jstring 字符串对象
Object[] jobjectArray 任何对象的数组
boolean[] jbooleanArray 布尔型数组
byte[] jbyteArray 比特型数组
char[] jcharArray 字符型数组
short[] jshortArray 短整型数组
int[] jintArray 整型数组
long[] jlongArray 长整型数组
float[] jfloatArray 浮点型数组
double[] jdoubleArray 双浮点型数组

2.打开eclipse,创建一个Android应用,名称:AndroidNDKTest

(1)打开自动生成的MainActivity.java,添加内容如下:

[java] view plaincopy
  1. public class MainActivity extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState)  
  5.     {  
  6.         super.onCreate(savedInstanceState);  
  7.    
  8.         TextView  tv = new TextView(this);  
  9.         tv.setText( stringFromJNI() );  
  10.         setContentView(tv);  
  11.         printString("hello");  
  12.     }  
  13.    
  14.     /** 
  15.      * 从c/c++文件中返回字符串 
  16.      * @return 
  17.      */  
  18.     public native String  stringFromJNI();  
  19.    
  20.     /** 
  21.      * 在c/c++文件中打印log信息 
  22.      * @param info 
  23.      */  
  24.     public native void printString(String info);  
  25.    
  26.     static {  
  27.         System.loadLibrary("hello-jni");  
  28.     }  
  29. }  

上面代码中,我们声明了两个本地函数,在返回值前添加了native标志,表明是在c/c++定义实现的。
(2)在项目根目录下创建一个jni文件夹,创建一个hello-jni.c文件,内容如下:

[java] view plaincopy
  1. #include <string.h>  
  2. #include <jni.h>  
  3. #include <android/log.h>  
  4.    
  5. JNIEXPORT jstring JNICALL  
  6. Java_com_example_ndktest_MainActivity_stringFromJNI( JNIEnv* env,  
  7.                                                   jobject thiz )  
  8. {  
  9.     return (*env)->NewStringUTF(env, "Hello from JNI !");  
  10. }  
  11.    
  12. JNIEXPORT void JNICALL  
  13. Java_com_example_ndktest_MainActivity_printString( JNIEnv* env,jobject thiz,jstring info)  
  14. {  
  15.     const jchar* strDest;  
  16.     strDest = (*env)->GetStringUTFChars(env,info,NULL);  
  17.     if(strDest == NULL)  
  18.     {  
  19.         return NULL;  
  20.     }  
  21.     __android_log_print(ANDROID_LOG_INFO, "printString", strDest);  
  22.     (*env)->ReleaseStringUTFChars(env,info,strDest);  
  23. }  

 

 

JNIEXPORT和JNICALL都是JNI的关键字,是一些宏,这里不写也可以(JNIEXPORT jstring JNICALL可以改成jstring)。java的String对象对应于jni的jstring类型,但是在本地方法中不能直接使用,需要先转换成char*,这里使用GetStringUTFChars方法将传进来的jstring类型转换成为UTF-8格式的char*,就能够在本地方法中使用了。注意:使用完你所转换之后的对象之后,需要显示调用ReleaseStringUTFChars方法,让JVM释放转换的对象的空间,如果不显示的调用的话,该对象不会被垃圾回收器回收,因此可能会导致内存溢出。
下面是访问String的一些方法:
GetStringUTFChars 将jstring转换成为UTF-8格式的char*
GetStringChars 将jstring转换成为Unicode格式的char*
ReleaseStringUTFChars 释放指向UTF-8格式的char*的指针
ReleaseStringChars 释放指向Unicode格式的char*的指针
NewStringUTF 创建一个UTF-8格式的String对象
NewString 创建一个Unicode格式的String对象
GetStringUTFLength 获取UTF-8格式的char*的长度
GetStringLength 获取Unicode格式的char*的长度

(3) 添加一个Android.mk,相当于makefile,用来实现自动化编译的。内如如下:

[html] view plaincopy
  1. LOCAL_PATH := $(call my-dir)  
  2.    
  3. include $(CLEAR_VARS)  
  4.    
  5. LOCAL_LDLIBS := -llog  
  6. LOCAL_MODULE    :hello-jni  
  7. LOCAL_SRC_FILES :hello-jni.c  
  8.    
  9. include $(BUILD_SHARED_LIBRARY)  

这里添加了LOCAL_LDLIBS := -llog和hello-jni.c中添加了#include <android/log.h>头文件,是为了实现在c/c++代码中打印log信息的,以便在logcat中查看。
(4)配置ndk编译环境,这个在我的这篇文章里有详细说明。
(5)clean,然后运行程序,如果不出错,结果如下图:
模拟器

 


LogCat打印信息


 
分享到:
评论

相关推荐

    android jni开发入门

    Android JNI(Java Native Interface)开发入门是Android应用开发中的一个重要环节,它允许Java代码和其他语言写的代码进行交互。JNI在Android系统中起到了桥梁的作用,使得开发者可以利用C、C++等本地代码来实现...

    AndroidJNI开发入门与提高中文最新版本

    本文档深入探讨了Android JNI开发的入门知识与提高技巧,旨在帮助开发者快速掌握如何在Android平台上进行混合编程。文档首先介绍了JNI的基本概念和工作机制,强调了Java与C/C++代码交互的必要性和优势。接着,文档...

    Android JNI开发入门之C/C++实现示例程序

    Android应用程序(APK)怎样通过JNI调用Native C/C++实现的共享库。Android系统的Java虚拟机为C和C++实现两套不同的API,本工程分别对其作出示例程序。并编译出libhelloworld.so/libhelloworldcpp.so共享库

    Android Studio JNI开发入门教程

    Android Studio的JNI(Java Native Interface)开发入门教程 JNI,全称为Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在Android开发中扮演着重要角色,尤其当...

    Android JNI开发手册

    Android JNI开发手册涵盖了使用Java本地接口(Java Native Interface,JNI)进行Android平台应用开发的核心知识。JNI是一种编程框架,允许Java代码和其他语言写的代码(主要是C或C++)进行交互。本手册是Android开发者...

    Android Studio jni开发之经典入门demo

    Android Studio JNI开发是Android应用程序与本地C/C++代码交互的重要技术。JNI,全称为Java Native Interface,它允许Java代码和其他语言写的代码进行交互。在Android应用中,JNI常用于优化性能,利用已有的C/C++库...

    Android Studio JNI编程入门实例

    在Android Studio中配置JNI开发环境,首先需要创建一个项目,选择"New Project",然后在模板选择中找到"Empty Activity"。创建完成后,为了引入C/C++支持,我们需要修改项目的build.gradle文件。在app模块的build....

    android jni开发指南

    ### Android JNI 开发指南 #### 一、简介 Android 的 JNI (Java Native Interface) 技术允许开发者在 Android 应用程序中调用 C 或 C++ 编写的原生代码,这种...希望这份指南能帮助您顺利入门 Android 的 JNI 开发。

    Android JNI入门Demo

    2. **JNI开发流程** - **编写Java代码**: 在Java类中声明本地方法,但不实现。 - **生成JNI头文件**: 使用`javah`命令,根据Java类生成包含本地方法声明的头文件。 - **编写本地代码**: 根据生成的头文件,实现...

    Android jni 编程实例

    在这个"Android jni 编程实例"中,我们将探讨如何在Android Studio环境下进行JNI开发,通过一个简单的入门demo来学习这个过程。 首先,我们需要了解JNI的基本概念。JNI是Java平台提供的一种接口,它允许Java代码...

    android jni 中文字符传递demo

    在Android应用开发中,JNI(Java Native Interface)是一种让Java代码和本地(C/C++)代码交互的技术。本文将深入探讨如何在Android的JNI中处理中文字符传递的问题,这是一个非常实用且重要的技能,特别是在需要高...

    hello-jni.rar_ android jni_android hello jni_android jni hellojn

    《Android NDK与JNI开发详解:从Hello-JNI入门》 Android系统以其开源性和灵活性吸引了大量的开发者,而JNI(Java Native Interface)则是Android平台中连接Java层与原生C/C++代码的重要桥梁。JNI允许开发者在...

    android jni demo--helloworld

    总结来说,这个"android jni demo--helloworld"是Android开发者学习JNI入门的典型示例,通过它,我们可以了解如何在Java和C/C++之间建立桥梁,以及如何在Android项目中有效地利用JNI功能。对于深入的Android开发,...

    android_jni操作指南.pdf

    根据提供的文件信息,以下是对...综上所述,这份Android JNI操作指南将涵盖如何搭建适合JNI开发的环境,以及通过一个简单示例程序来具体展示Java与C/C++代码之间的交互,对初学者而言是理解和应用JNI的一个入门指导。

    jni开发入门+深入

    ### JNI开发入门与深入知识点详解 #### 一、JNI简介 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码与其他语言写的代码进行交互(例如C、C++)。JNI为开发人员提供了强大的功能,使得Java...

    Android下JNI入门详解

    ### Android下JNI入门详解 #### 一、JNI与VM简介 JNI(Java Native Interface)作为Android平台上连接Java层与C/C++层的关键桥梁,在开发过程中起着至关重要的作用。通过JNI,开发人员能够实现Java与C/C++代码之间...

    Android jni demo

    JNI在Android开发中的应用广泛,特别是在性能敏感、需要利用硬件加速或者调用C/C++库的场景,例如游戏开发、图像处理、音频视频处理等。本示例“Android JNI Demo”提供了一个入门级别的工程,帮助开发者了解和学习...

    Android Studio JNI开发入门教程-附件资源

    Android Studio JNI开发入门教程-附件资源

    JNI资源汇总

    - "Android JNI开发入门与提高":这份文档可能涵盖了JNI的基础知识,如如何创建和调用本地方法,以及进阶主题,如异常处理和线程同步。 - "Android的jni的调用C,C++的几个应用":可能讲解了JNI在实际项目中的应用...

    JNI入门Demo3.0

    JNI在Android开发中尤为重要,特别是在需要调用C/C++原生代码以提升性能或者利用现有库时。本教程“JNI入门Demo3.0”主要针对的是JNI的动态注册Native函数这一核心概念。 首先,我们需要理解什么是JNI。JNI是一种...

Global site tag (gtag.js) - Google Analytics