Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> Android NDK之JNI使用例子

Android NDK之JNI使用例子

編輯:初級開發

 目前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 android:minSdkVersion="3" /> 這裡我們看到JNI調用無需特殊的權限。

 而在Native C/C++中我們可以直接使用C++庫,不過這裡包含了jni這個頭文件。

 #include <string.h>
#include <jni.h>

其中下面的返回類型JString是VM String,在jni.h頭文件中有定義

JString Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
{
    return (*env)->NewStringUTF(env, "Hello from JNI, android123 Test!");
}

其實很好理解的,僅僅是換個了別名而以,定義如下

typedef uint8_t         jboolean;       /* unsigned 8 bits */
typedef int8_t          jbyte;          /* signed 8 bits */
typedef uint16_t        jchar;          /* unsigned 16 bits */
typedef int16_t         JShort;         /* signed 16 bits */
typedef int32_t         jint;           /* signed 32 bits */
typedef int64_t         jlong;          /* signed 64 bits */
typedef float           jfloat;         /* 32-bit IEEE 754 */
typedef double          jdouble;        /* 64-bit IEEE 754 */
#else
typedef unsigned char   jboolean;       /* unsigned 8 bits */
typedef signed char     jbyte;          /* signed 8 bits */
typedef unsigned short  jchar;          /* unsigned 16 bits */
typedef short           JShort;         /* signed 16 bits */
typedef int             jint;           /* signed 32 bits */
typedef long long       jlong;          /* signed 64 bits */
typedef float           jfloat;         /* 32-bit IEEE 754 */
typedef double          jdouble;        /* 64-bit IEEE 754 */
#endif


typedef jint            JSize;

還有一些調用平時注意的聲明

#define JNI_FALSE   0
#define JNI_TRUE    1

#define JNI_VERSION_1_1 0x00010001
#define JNI_VERSION_1_2 0x00010002
#define JNI_VERSION_1_4 0x00010004
#define JNI_VERSION_1_6 0x00010006

#define JNI_OK          (0)         /* no error */
#define JNI_ERR         (-1)        /* generic error */
#define JNI_EDETACHED   (-2)        /* thread detached from the VM */
#define JNI_EVERSION    (-3)        /* JNI version error */

#define JNI_COMMIT      1           /* copy content, do not free buffer */
#define JNI_ABORT       2           /* free buffer w/o copying back */

#define JNIIMPORT
#define JNIEXPORT
#define JNICALL

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved