接著上篇文章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