編輯:高級開發
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
android Binder機制大部分都是使用的IPC,進程間通信機制有很多種,例如Linux中可以采用管道,消息隊列,信號,共享內存,socket等,這些都可以實現進
android系統獲得了根節點的參數,它就可以直接通過節點來無效化,測距和繪制樹。當你的Activity被激活並且獲得焦點時,開發既有用又有吸引力的移動服務,並推廣這些
; Log.v(BROADCAST_TAG, myBroadCast);}@Overridepublic void onReceive(Context context,
事件是一種有用來收集用戶與應用程序互動數據的互動組件,如按鍵或觸摸屏等放置事件,因為每個事件從Android框架維護事件隊列先入先出(FIFO)基礎上的隊列。可以在程序中