Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android JNI/NDK開發之基本姿勢(二)

Android JNI/NDK開發之基本姿勢(二)

編輯:關於Android編程

接著上篇文章Android JNI/NDK開發之基本姿勢<一>,今天我們講講怎麼調用native方法,以及native調用java層方法,上篇文章我們已經完成了編譯工作,今天我們就來學習下怎麼去調用,在這之前我們更改下之前的JniDemo.c采用C++語法來實現,滿足下口味不同的人,更改如下:

//
// Created by Q.Jay on 2016/5/8.
//
#include 

/*
 * Class:     com_jay_ndkdemo_JniDemo
 * Method:    getHelloWordText
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_jay_ndkdemo_JniDemo_getHelloWordText
  (JNIEnv * env, jobject obj)
{
 return env->NewStringUTF("Hello Word From Jni ");
}

調用Native代碼

1.調用之前我們要先加載*.so文件

System.loadLibrary("jnidemo");

"jnidemo"是我們上篇編譯時取好的名字,此句代碼一般只要調用一次就好,在什麼時候調用了?怎麼調用好了?

什麼時候調用?你只要保證在調用native方法之前調用就好了
怎麼調用好了?一般采用在靜態代碼塊中,比如此處Demo項目中:

public class MainActivity extends AppCompatActivity {
    static {
        System.loadLibrary("jnidemo");
    }
}

下面我們看看調用代碼

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final JniDemo jniDemo = new JniDemo();
    textView = (TextView) findViewById(R.id.textView);
    findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            textView.setText(jniDemo.getHelloWordText());
        }
    });
}

至此,調用結束,可以直接運行看效果,是不是很簡單?

實現Native調用Java層方法

我們要實現native調用java方法,首先我們要准備一個java方法,如下:

public static void showToast() {
        Toast.makeText(sContext, "此方法由Native方法調用", Toast.LENGTH_SHORT).show();
    }

我這裡在MainActivity中准備了一個靜態方法,然後實現了toast,下面我們看關鍵代碼,native怎麼實現去調用這個方法,代碼如下:

JNIEXPORT jstring JNICALL Java_com_jay_ndkdemo_JniDemo_getHelloWordText
  (JNIEnv * env, jobject obj)
{
//找到我們要調用的方法,注意包名+類名
 jclass clazz = env->FindClass("com/jay/ndkdemo/MainActivity");
 //獲取某個靜態方法的ID
 //clazz 是我們上面找到的類的字節碼文件
 //showToast 是clazz類中的方法名
 //"()V" 這個表示方法的簽名;()是方法的參數列表;V表示方法的返回類型;V -> void
  jmethodID id = env->GetStaticMethodID(clazz, "showToast","()V");
  //最後調用這個方法,CallStaticVoidMethod(clazz,方法ID)
   env->CallStaticVoidMethod(clazz,id);
 return env->NewStringUTF("Hello Word From Jni ");
}

至此,就實現了native調用java層代碼,本系列文章最終就實現了點擊某個按鈕調用native方法返回的文本顯示在TextView上,而在native方法返回文本之前,調用了java層的一個toast方法

最後我們看下效果:

jni

Demo代碼地址

GitHub:https://github.com/JaySong/NdkDemo

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