編輯:中級開發
一、 在JNI中執行Java方法
class androidJniDemo {
private native void executeMethod();
private void show() {
System.out.println("Java cwj print"); //執行了show方法後打印Java層的輸出
}
public static void main(String args[]) { //這裡我們在J2SE中測試,android開發者可以放到Activity中的onCreate調用
AndroidJniDemo ajd = new androidJniDemo();
ajd.executeMethod();
}
static {
System.loadLibrary("androidJniDemo");
}
}
下面是JNI代碼:
JNIEXPORT void JNICALL
Java_androidJniDemo_executeMethod(JNIEnv *env, jobject obj)
{
jclass clazz = (*env)->GetObjectClass(env, obj); //通過類的對象
jmethodID mid = (*env)->GetMethodID(env, clazz, "show", "()V"); //查找Java中的show方法的ID,最後的簽名符號為void類型
if (mid == NULL) {
return; //如果方法ID沒有找到
}
printf("JNI cwj print"); //從JNI中打印輸出
(*env)->CallVoidMethod(env, obj, mid); //執行show方法
}
二、獲取/設置類的域或者說屬性字段
(1 String類型的屬性讀寫
class androidJniDemo2 {
private String sTmp;
private native void readwriteFIEld();
public static void main(String args[]) {
AndroidJniDemo2 ajd2 = new androidJniDemo2();
ajd2.sTmp = "cwj";
ajd2.readwriteFIEld();
System.out.println("Java cwj print ="+ajd2.sTmp); //Java層打印結果
}
static {
System.loadLibrary("androidJniDemo2");
}
}
下面是JNI層代碼:
JNIEXPORT void JNICALL
Java_androidJniDemo2_readwriteField(JNIEnv *env, jobject obj)
{
jfIEldID fid;
jstring JStr;
const char *szTemp;
jclass clazz = (*env)->GetObjectClass(env, obj);
fid = (*env)->GetFIEldID(env, clazz, "sTmp", "Ljava/lang/String;"); // 注意sTmp是Java中聲明的,String類型在Java.lang.String包中,簽名符號的格式注意
if (fid == NULL) {
return;
}
JStr = (*env)->GetObjectFIEld(env, obj, fid); //Java的String類型,要用GetObjectFIEld函數獲取,這裡android123提示大家沒有GetStringFIEld這樣的函數在JNI中,或者說在C語言中
szTemp = (*env)->GetStringUTFChars(env, JStr, NULL); //因為還需要賦值,在C中我們轉換為utf8的類型。
if (szTemp == NULL) {
return;
}
printf("JNI cwj print=%s", szTemp); //先打印Java層傳進來的值
(*env)->ReleaseStringUTFChars(env, JStr, szTemp); //szTemp打印完不用了要及時釋放掉
JStr = (*env)->NewStringUTF(env, "android123"); //返新的字段值,供Java層打印
if (JStr == NULL) {
return;
}
(*env)->SetObjectFIEld(env, obj, fid, JStr); //設置新的屬性值。
}
(2 int或double類似的類型的屬性讀寫,本例同時屬性值是一個靜態的定義,注意下面加粗的static關鍵字
class androidJniDemo3 {
private static int sAge;
private native void readwriteFIEld();
public static void main(String args[]) {
AndroidJniDemo3 ajd3 = new androidJniDemo3();
androidJniDemo3.sAge = 23;
ajd3.readwriteFIEld(); //執行jni層
System.out.println("Java cwj print="+sAge); //Java層打印新的值,應該為120
}
static {
System.loadLibrary("androidJniDemo3");
}
}
JNIEXPORT void JNICALL
Java_androidJniDemo3_readwriteField(JNIEnv *env, jobject obj)
{
jfIEldID fid;
jint nTemp;
jclass clazz = (*env)->GetObjectClass(env, obj);
fid = (*env)->GetStaticFIEldID(env, clazz, "sAge", "I"); //因為是整形,這裡簽名符號為I,注意使用的函數中包含Static代表是一個靜態的屬性
if (fid == NULL) {
return;
}
nTemp = (*env)->GetStaticIntFIEld(env, clazz, fid);
printf("JNI cwj print=%d", nTemp); //這裡應該顯示23
(*env)->SetStaticIntFIEld(env, clazz, fid, 120); //設置新的值為120,注意包含了Static,Java層中定義的sAge是靜態的。
}
今天android開發網給出了較完整的JNI下執行Java的源代碼第一部分,有關第二部分可以查看 android JNI實例代碼(二)
從Android 3.1開始將支持USB配件連接到Android設備,通過附件通訊協議,同時在Android 2.3.4中通過附加庫也可以兼容這些功能,目前可以在Nex
本文節選於機械工業出版社推出的《Android應用開發揭秘》一書,作者為楊豐盛。本書內容全面,詳細講解了Android框架、android組件、用戶界面開發、游戲開發、
在android開發應用中,默認的Button是由系統渲染和管理大小的。而我們看到的成功的移動應用,都是有著酷炫的外觀和使用體驗的。因此,我們在開發產品的時候,需要對默
簡介: 本文詳細介紹了 Android 應用編程中 Activity 的生命周期、通信方式和 Intent Filter 等內容,並提供了一些日常開發中經常用