Android JNI/NDK開發(fā)之基本姿勢<二>

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

//
// Created by Q.Jay on 2016/5/8.
//
#include <com_jay_ndkdemo_JniDemo.h>

/*
 * 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 <C++>");
}

調(diào)用Native代碼

1.調(diào)用之前我們要先加載*.so文件

System.loadLibrary("jnidemo");

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

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

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

下面我們看看調(diào)用代碼

@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());
        }
    });
}

至此,調(diào)用結(jié)束,可以直接運行看效果,是不是很簡單?

實現(xiàn)Native調(diào)用Java層方法

我們要實現(xiàn)native調(diào)用java方法,首先我們要準備一個java方法,如下:

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

我這里在MainActivity中準備了一個靜態(tài)方法,然后實現(xiàn)了toast,下面我們看關(guān)鍵代碼,native怎么實現(xiàn)去調(diào)用這個方法,代碼如下:

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

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

最后我們看下效果:

jni

Demo代碼地址

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,063評論 25 709
  • Android跨進程通信IPC整體內(nèi)容如下 1、Android跨進程通信IPC之1——Linux基礎(chǔ)2、Andro...
    隔壁老李頭閱讀 11,786評論 1 46
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,728評論 18 399
  • 歲月,兩個字, 寫起來簡單,聽起來幽遠。 經(jīng)歷過卻是,風(fēng)雨兼程,滿懷滄桑。 多少人留下無奈在心中, 又有多少人遺憾...
    魅影纖指閱讀 462評論 0 0
  • 在行在六月初上線了分答,一時間吸引了一眾大V入駐,尤其是網(wǎng)紅們大家紛紛跑步前來對粉絲變現(xiàn),并讓一些先知的粉絲跟著偶...
    一字彎閱讀 339評論 0 0

友情鏈接更多精彩內(nèi)容