目前Android NDK只能編譯出動(dòng)態(tài)庫(kù).so文件,并不是能生成.apk文件,這里我們簡(jiǎn)單介紹下NDK中的Hello JNI列子。整個(gè)例子分Java和Native C兩個(gè)部分。首先是我們常用的Java端調(diào)用部分。 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() ); //如果調(diào)用失敗將會(huì)拋出 java.lang.UnsatisfiedLinkError異常 setContentView(tv); } //注意下面的native關(guān)鍵字 public native String stringFromJNI(); public native String unimplementedStringFromJNI(); static { System.loadLibrary("hello-jni"); //載入hello-jni庫(kù) } } 需要注意的是這里必須設(shè)置SDK版本為1.5或以上版本即在androidmanifest.xml文件中指明<uses-sdk android:minSdkVersion="3" /> 這里我們看到JNI調(diào)用無需特殊的權(quán)限。 而在Native C/C++中我們可以直接使用C++庫(kù),不過這里包含了jni這個(gè)頭文件。 #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!"); } 其實(shí)很好理解的,僅僅是換個(gè)了別名而以,定義如下 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; 還有一些調(diào)用平時(shí)注意的聲明 #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 |
|