Java層調用JNI層函數:
例子:
Java層: BrowserFrame::loadurl( )
- 調用JNI別名: Nativeloadurl() ;
JNI 層:WebFrame::loadurl( ) ;
1、將java層中的函數對應JNI層中的函數,以方便調用之。
在JNI層定義需要用的函數WebFrame::loadurl( )
static void LoadUrl(JNIEnv *env, jobject obj, jstring url)
-----------------------------------------------------------------------------------------
jniRegisterNativeMethods(JNIEnv* env, const char* className,
const JNINativeMethod* gMethods, int numMethods)
// className :java層的類名。
// gMethods :對應JNINativeMethod的數組。
------------------------------------------------------------------------------------------
typedef struct {
const char* name; //函數名(java層中聲明)
const char* signature; // 函數參數
void* fnPtr; // 函數指針(指向JNI層 -> WebFrame::loadurl( ) )
} JNINativeMethod;
------------------------------------------------------------------------------------------
Eg. 將如上JNI函數使用別名:Nativeloadurl( ) (java層中聲明),存于注冊數組中。
JNINativeMethod gMethods[]={
{ "nativeLoadUrl", "(Ljava/lang/String;)V", (void*) LoadUrl }
...
}
------------------------------------------------------------------------------------------
2. 在Java層中聲明并調用函數:nativeLoadUrl(String url)
聲明:
private native void nativeLoadUrl(String url);
調用:
nativeLoadUrl(url);
JNI層調用Java函數:
void Download::transportUrl(WebCore::FrameView* view, WebCore::String url)
{
WebViewCore* viewcore = WebViewCore::getWebViewCore(view);
JNIEnv* env = JSC::Bindings::getJNIEnv();
jstring jUrl = env->NewString(url.characters(), url.length());
// 1. 獲得Java該類的 jclass對象
jclass mODP = env->FindClass("archermind/webkit/Observor/ODP");
// 2. 通過該對象,取得相應java函數及參數到 -> jmethodID中
jmethodID msendDownloadRequest = env->GetStaticMethodID(
mODP, "sendDownloadRequest", "(Larchermind/webkit/core/WebView;Ljava/lang/String;)V");
// 3. 在JNI層中,通過函數調用CallStaticVoidMethod來調用java函數。
env->CallStaticVoidMethod(mODP, msendDownloadRequest, viewcore->getWebViewJavaObject(),jUrl);
// viewcore->getWebViewJavaObject() 為 arg1 .
// jURL 為arg2 .
env->DeleteLocalRef(jUrl);
}