jni的環境搭建

最近研究了一下android jni的用法,JNI全稱爲Java Native Interface(JAVA本地調用)。從Java1.1開始,JNI成爲java平臺的一部分,它允許Java代碼和其他語言寫的代碼(如C&C++)
進行交互。並非從Android發佈才引入JNI的概念的。要實現JNI編程,首先要準備工具,我的是平時用的android開發環境,sdk eclipse,另外又下載了一個ndk.
簡單來說,Android的NDK提供了一些交叉編譯工具鏈和Android自帶的庫,這些Android的庫可以讓開發者在編寫本地語言的程序時調用。
        而NDK提供的交叉編譯工具鏈就對已經編寫好的C&C++代碼進行編譯,生成庫。
        當然了,你也可以自己搭建交叉編譯環境,而不用NDK的工具和庫。然後生成庫,只要規範操作,一樣可以生成能讓JAVA層成功調用的庫文件的。
        我是從網上下載的android-ndk32-r10b-windows-x86版本,放到一個文件夾下解壓,注意路徑中儘量不要用中文。
3、JNI  調用流程
 1、首先先在eclipse上新建一個工程,命名爲 JniDemo 我是保存在了E:\demo\JniDemo
 2、重新創建一個類,我命名爲JniUtils,在這個類裏聲明一個方法 
  public class JniUtils {
   public static native  String getStringFromC();
  }
 3、在MainActivity中引用此方法
 public class MainActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  Log.i("msg", "ddd:" + JniTest.getStringFromC());
 }
 
}
 4、在工程下添加 jni 的文件,新建一個Android.mk文件,我需要交互的是c++語言,我的Android.mk如下:
 LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := JniDemo
LOCAL_SRC_FILES := JniDemo.cpp
include $(BUILD_SHARED_LIBRARY)
 若爲C語言交互,Android.mk如下:
 LOCAL_PATH := $(call my-dir)
   include $(CLEAR_VARS)
   LOCAL_MODULE    := JniDemo
   LOCAL_SRC_FILES := JniDemo.c 
   include $(BUILD_SHARED_LIBRARY)
   
   其中module爲即將生產的.so包名,在java代碼裏需要引用此包名,files是對應要新建的C/C++文件名
   添加到Android.mk文件,再繼續在jni文件夾裏添加.c/.cpp文件,文件名爲files對應的名字
   
   5、添加ndk路徑,在eclipse的Windows->Preferences下Android->NDK下有NDK Location選項,選則解壓的ndk的路徑
   在eclipse的Project->Properties下選擇Builders下選擇new,在彈窗選擇Program進到設置頁面
   Location選擇ndk的路徑\ndk-build.cmd
   Working Directory選擇工程所在的目錄
   然後選擇第二項Refresh 進行相應配置
   選擇第4項Build Options進行相應配置
   6、打開工程所在文件夾,進入bin->classes 進入E:\demo\JniDemo\bin\classes\com\example\jnidemo查看是否有native方法
   所在文件的.class文件,
   cmd運行環境,進到classes所在的目錄,執行javah com.example.jnidemo.JniUtils在classes下回生成.h文件,將此文件
   複製到eclipse的jni文件夾下
   7、編寫c文件,如下
 JNIEXPORT jstring JNICALL Java_com_example_jnidemo_JniUtils_getStringFromC(JNIEnv * env, jclass obj){
    //java to c
    return env->NewStringUTF("this is c++ code");
}
 8、最後在MainActivity中添加引用包
 static {
  System.loadLibrary("JNIDemo");
 }
 9、運行,打印出this is c++ code.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章