Jni函式的靜態繫結
Jni函式繫結有兩種方法,一種是靜態繫結,一種是註冊方式。當前介紹靜態繫結
1 構造Java類
package cn.search;
import java.io.File;
import android.os.Environment;
import android.util.Log;
public class PoiResolver{
public native String GetDistrictName(String storagePath, double longtitude, double latitude);
public native String GetPOIName(String storagePath, double longtitude, double latitude);
public native String GetRoadName(String storagePath, double longtitude, double latitude);
}
說明:native修飾符告訴Java編譯器這是一個繫結到JNI的函式原型
2 利用javah生成標頭檔案
本專案使用Eclipse建立Android工程,進入工程的頂級目錄,PoiResolver類檔案儲存在src/cn/search目錄下
在頂級目錄下執行如下在指令:javah -o jni/cn_search.h -classpath src/ -jni cn.search.PoiResolver
-o:指定輸出的檔名稱,將在jni下建立cn_search.h檔案,然後將標頭檔案內容寫入該檔案
-classpath:指定需要生成h檔案的類所在的包所在的位置(包cn.search在src/目錄下)
-jni:指定需要生成h檔案的類,這個時候必須指定詳細的包名+類名
可以使用-d引數,但是不能夠再使用-o引數,沒有指定檔名的情況下,預設名稱為包名+類名.h
注意
在jni的.c檔案中呼叫env,必須這樣呼叫:return (*env)->NewStringUTF(env, “Hello !”);
在jni的.cpp檔案中呼叫env,必須這樣呼叫:return env->NewStringUTF(“Hello !”);
3 編寫Application.mk
該檔案定義了哪種平臺的so檔案,進入jni資料夾,建立Application.mk檔案,寫入內容:
APP_ABI := all
將生成四種平臺的so檔案:armeabi-v7a armeabi x86 mips
使用ndk-build指令生成so檔案時候,可以通過傳遞引數,例子如下:ndk-build APP_ABI = armeabi-v7a ,單獨生成某一個平臺so檔案,當然也可以直接在檔案中修改
4 建立Android.mk檔案
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_MODULE := libsearch
LOCAL_SRC_FILES := cn_search_poiresolver.cpp
include $(BUILD_SHARED_LIBRARY)
注意
對於動態註冊的方式,函式的引數列表前面兩個引數是固定的:
static void SetSystemParameter(int paramType, int paramValue)
{
}
目前一段時間沒有寫jni介面,因此例如上面的函式定義是錯誤的,在呼叫該函式的時候,會發現傳遞進來的引數都是錯誤的,是一個非常龐大的資料,因此懷疑其實傳遞進來的其實是一個指標值!!
正確
static void SetSystemParameter(JNIEnv* env, jobject obj, jint paramType, jint paramValue)
{
}
相關文章
- 理解靜態繫結與動態繫結
- C++的動態繫結和靜態繫結C++
- C++ — 靜態繫結與動態繫結C++
- 動態繫結和靜態繫結的簡單理解
- java繼承-靜態繫結和動態繫結Java繼承
- 深入理解 C++ 的動態繫結和靜態繫結C++
- php 後期靜態繫結PHP
- JavaScript函式繫結JavaScript函式
- 對 PHP 後期靜態繫結的理解PHP
- JNI呼叫c動態連結庫函式程式碼實踐函式
- 函式的靜態變數 static函式變數
- 後期靜態繫結在PHP中的使用PHP
- Laravel 中的一個後期靜態繫結Laravel
- 類內的靜態成員函式函式
- 靜態資料成員和靜態成員函式函式
- C# 清除事件繫結的函式C#事件函式
- Android 深入理解 JNI(一)JNI 原理與靜態、動態註冊Android
- 繫結變數在靜態sql和動態sql中變數SQL
- PHP延遲靜態繫結:static關鍵字PHP
- PHP學習筆記——延遲靜態繫結PHP筆記
- C#靜態建構函式及靜態變數學習C#函式變數
- Vue 動態繫結CSS樣式VueCSS
- javascript 函式中的 this 的四種繫結形式JavaScript函式
- linux 動態庫 靜態庫 函式覆蓋Linux函式
- jquery繫結未來新建立函式的方法onjQuery函式
- QT之靜態函式傳送訊號QT函式
- 類中靜態回撥函式應用函式
- php的ob函式實現頁面靜態化PHP函式
- java靜態變數和靜態函式是否可以被繼承,重寫!Java變數函式繼承
- 避免因在類中使用靜態函式而大量使用靜態變數 (轉)函式變數
- Laravel 路由的隱式繫結和顯式繫結Laravel路由
- 函式計算支援 MySQL 例項繫結函式MySql
- 深入理解PHP物件導向之後期靜態繫結PHP物件
- DELPHI中的靜態虛擬及動態方法函式的區別。 (轉)函式
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- 父類與子類之間靜態函式的呼叫以及函式引數的傳遞函式
- js如何給事件繫結的函式傳遞引數JS事件函式
- React中this值繫結和事件函式傳參React事件函式