這裡簡單說一下ndk中c調用java的方法
至於ndk的環境搭建這裡就不說了,有空會貼上來
java調c的感覺相對比較簡單,以後有空一並貼上來,這裡說下 c去回調java的代碼了
首先創建工程就不說了,我們這裡展開一個經典例子 helloworld 哈哈哈
第一步,在android工程中 建一個類,裡面放個方法,syso一個helloworld。同時建議建立一個activity,這樣可以放一個按鈕,點擊的時候可以看到效果
這裡稍微展開下 1:寫一個java方法
public void helloFromJava(){
System.out.println("helloFromJava");
}
2:寫對應的native方法
static{
System.loadLibrary("Hello");
}
public native void callback1();
3:實現一下調用,放在按鈕中去調用,就不說啦
4:這裡需要用javah實現一下C頭文件的生成,當然也可以不這麼做,另外的方法我就不展開了
第二部 在ndk中建立C文件啦
#include <jni.h>
#include "com_itheima15_ndk4_DataProvider.h" //這個頭文件由 jdk 中的javah生成,相信來看這個的,就不需要介紹javah怎麼用了哦
//日志模塊,習慣性的放一個日志模塊,方便去調試
#include <android/log.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
JNIEXPORT void JNICALL Java_com_xuchulong_ndk4_DataProvider_callback1
(JNIEnv * env, jobject obj){
//C調用java空方法
/*
* 1、 找到該方法存在哪個類中(找到存在該方法的類)
* 2、在該類中找到該方法
* 3、執行該方法
* */
char* classname = "com/xuchulong/ndk4/DataProvider";//這個是我的類名,根據自己情況放,我的helloworld就放在這個裡面的
//第一步 找到該類
// jclass (*FindClass)(JNIEnv*, const char*);
jclass clazz = (*env)->FindClass(env, classname);
//第2步 在該類中找到該方法
// jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
// jclass 在那個類中查找
// const char* 查找的方法名稱
// const char* 方法的簽名 jdk javap -s 得到方法的簽名
使用方法: javap -s 包名.類名
jmethodID method = (*env)->GetMethodID(env, clazz, "helloFromJava", "()V");
//執行該方法
//void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
(*env)->CallVoidMethod(env, obj, method);
}
好了C代碼部分完成了 ndk-build一下哦,呵呵