Android JNI 編程

JNI函數名稱分為三部分:
首先是Java關鍵字,供Java虛擬機識別;例如Java_com_example_hellojni_HelloJni_stringFromJNI
Java:關鍵字
com_example_hellojni:包名
HelloJni:文件名稱(原來的名稱為hello_jni)
stringFromJNI:函數名稱
然後是調用者類名稱(全限定的類名,其中用下劃線代替名稱分隔符);
最後是對應的方法名稱,各段名稱之間用下劃線分割。

JNI函數_的參數也由三部分組成:
首先是JNIEnv *,是一個指向JNI運行環境的指針;
第二個參數隨本地方法是靜態還是非靜態而有所不同一一非靜態本地方法的第二個參數是對對象的引用,而靜態本地方法的第二個參數是對其Java類的引用;
其餘的參數對應通常Java方法的參數,參數類型需要根據一定規則進行映射。
jstring //返回類型,String
     Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
     {
         return (*env)->NewStringUTF(env, "Hello from JNI !");
     }

編寫make文件:
LOCAL_PATH := $(call my-dir)               //源文件地址,必須在第一行

include $(CLEAR_VARS)                         //清楚一些變量,LOCAL_PATH除外

LOCAL_MODULE    := hello-jni               //指定當前編譯模塊的名稱
LOCAL_SRC_FILES := hello-jni.c            //源文件

include $(BUILD_SHARED_LIBRARY)      //將當前模塊編譯為共享鏈接庫,前綴為lib,後綴為.so

最後在Cygwin交叉編譯環境中編譯該文件他就會在根目錄的libs目錄下生成
        armeabi/libhello-jni.so文件

把該libs目錄拷貝到Eclipse中的根目錄就可以使用已編寫的本地方法瞭
代碼:
public class HelloJni extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        TextView  tv = new TextView(this);
        tv.setText(stringFromJNI());
        setContentView(tv);
    }
    public native String  stringFromJNI();
    public native String  unimplementedStringFromJNI();
    static {
        System.loadLibrary("hello-jni");
    }
}

摘自 xtcpcgx的專欄

發佈留言