在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代碼
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()); } }
進入到項目的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++
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 ... "); }
經過cygwin編譯c文件,進入到項目目錄,個人項目名稱是jni,進入以後執行「ndk-build」命令,出現以下圖所示表示執行成功。ide
須要將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__)
static{ //加載二進制文件 System.loadLibrary("Hello");//libHello.so 去掉lib和so }
2.7 最後部署項目,運行。spa