JNI由淺入深_3_Hello World

一、須要準備的工具,eclipse,cdt(c++)插件,cygwin(unix)和 android ndk.

  在cygwin的etc目錄下將ndk的路徑引入到profile文件中,能夠在cygwin的任何目錄均可以訪問到ndk,不一樣的ndk路徑PATH的寫法不一樣.html

  : ${ORIGINAL_PATH=${PATH}}
  if [ ${CYGWIN_NOWINPATH-addwinpath} = "addwinpath" ] ; then
    PATH="/usr/local/bin:/cygdrive/d/cgwin/android-ndk-r7b:/usr/bin${PATH:+:${PATH}}"
  else
    PATH="/usr/local/bin:/usr/bin:/cygdrive/d/cgwin/android-ndk-r7b"
  fi

二、開發步驟:java

a.建立一個android工程
b.JAVA代碼中寫聲明 native 方法 public native String helloFromJNI(); 經過javah  包名.類名生成jni的方法簽名
c. 建立jni目錄,編寫c代碼,方法名字要對應。或者將生成的簽名文件拷貝到jni目錄,而後在c代碼中引入。
d.編寫Android.mk文件
e.Ndk編譯生成動態庫( ndk -build )
f.Java代碼load 動態庫.調用native代碼

  2.1 建立一個Android項目,建立native方法.

public class MainActivity extends Activity {
    static{
        //加載二進制文件
        System.loadLibrary("Hello");//libHello.so 去掉lib和so
    } 
    public native String helloFormC();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        System.out.println("------------"+helloFormC());
    }

}

2.2 javah命令生成簽名

進入到項目的bin/classes命令下,執行命令 javah com.example.jni.MainActivity,將生成的頭文件拷貝到jni目錄下,在c文件中引入頭文件 #include "com_example_jni_MainActivity.h" 。下面是javah命令的參數 和 生產頭文件方式。android

 在使用javah命令時若是遇到找不到Activity類,說明android的jar包沒有導入進去,一種辦法將jar包加入到classpath路徑中去,classpath   .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\tools.jar;E:\developLib\android\platforms\android-8\android.jar;另外一種方法是在window命令窗口執行:D:\project3\JNIAndroid>set classpath=D:\project3\JNIAndroid\src。c++

   2.3 建立C文件

jobject  就是當前方法所在的類表明的對象.JNIEnv類型表明了java環境 經過JNIEnv指針,就能夠對java端的代碼進行操做.eclipse

#include <stdio.h>
#include <jni.h>
#include <malloc.h>
#include "com_example_jni_MainActivity.h";

JNIEXPORT jstring JNICALL Java_com_example_jni_MainActivity_helloFormC
  (JNIEnv * env, jobject obj){

    return (*env)->NewStringUTF(env,"hello from c ... ");
}

  2.4 編譯

經過cygwin編譯c文件,進入到項目目錄,個人項目名稱是jni,進入以後執行「ndk-build」命令,出現以下圖所示表示執行成功。ide

  2.5 建立Android.mk文件

須要將hello-jni替換成本身的c文件模塊名稱,在ndk中的位置 file:///D:/cgwin/android-ndk-r7b/docs/ANDROID-MK.html:工具

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    :=Hello
LOCAL_SRC_FILES :=Hello.c
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)

LOCAL_LDLIBS += -llog表示在jni中打印日誌信息,次信息在android控制檯上能夠看到。須要在c文件中加入以下代碼:ui

#include <android/log.h>
#define LOG_TAG "System.out.c"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

2.6 在android項目中的java文件引入編譯生成的二進制文件。

static{
        //加載二進制文件
        System.loadLibrary("Hello");//libHello.so 去掉lib和so
}

  2.7 最後部署項目,運行。spa

相關文章
相關標籤/搜索