編輯:關於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 ");
}
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
方法,首先我們要准備一個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
方法
最後我們看下效果:
GitHub:https://github.com/JaySong/NdkDemo
一基礎知識 android的事件處理分為3步。 1)public booleandispatchTouchEvent(MotionEvent ev) 這個方法用來分發
概述:MediaRecorder的狀態圖:代碼:開始錄制音頻:mRecorder = new MediaRecorder(); //Sets
今天接觸了Dagger這套android的依賴注入框架(DI框架),感覺跟Spring 的IOC差不多吧。這個框架它的好處是它沒有采用反射技術(Spring是用反射的)
刷機是什麼意思?其實簡單來說就是給平板電腦重裝系統,當你的電腦遇到所有問題都可以使用刷機來解決,比如忘記密碼鎖、進不去系統等,使用刷機都可以輕松搞定,那麼我