Android ndk第一步,構建jni headers

轉載請註明出處:http://www.cnblogs.com/fpzeng/p/4281801.html javascript

源碼請見 https://github.com/fpzeng/HelloJNIhtml

PC系統: ubuntu 12.04java

Android SDK: android-sdk-linux_r24linux

Android NDK:android-ndk-r10dandroid

概述

在android上使用ndk的步驟:git

  1. 建立java文件,聲明native方法;
  2. 使用javah生成C語言接受的頭文件*.h;
  3. 建立*.c文件,使用C語言實現該native方法;
  4. 編譯*.c文件產生so庫
  5. 運行的時候,java使用System.loadLibrary打開so庫,調用native方法。

聲明native方法

在com.fpzeng.example.jni.HellojniActivity聲明native方法:github

private native String nativeGetMacAddress(int Parameter1);

此時目錄結構以下: shell

AndroidManifest.xml  
-jni 
   Android.mk 
   -src   
     hello_jni.c 
-src    
  -com    
     -fpzeng  
        -example
           -jni
              HellojniActivity.java
-res ...  

 

產生頭文件

使用javah產生jni頭文件,會將產生的頭文件com_fpzeng_example_jni_HellojniActivity.h輸出到jni目錄下。命令以下:ubuntu

javah -jni -d jni -classpath src/ com.fpzeng.example.jni.HellojniActivityapp

產生的 com_fpzeng_example_jni_HellojniActivity.h頭文件以下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_fpzeng_example_jni_HellojniActivity */

#ifndef _Included_com_fpzeng_example_jni_HellojniActivity
#define _Included_com_fpzeng_example_jni_HellojniActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_fpzeng_example_jni_HellojniActivity
 * Method:    nativeGetMacAddress
 * Signature: (I)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_fpzeng_example_jni_HellojniActivity_nativeGetMacAddress
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

此時的入參數是int,返回值類型時String類型。  

引入Android SDK

若是將java中聲明的native方法變的複雜,好比引入Context。在com.fpzeng.example.jni.HellojniActivity聲明native方法更新爲

private native String nativeGetMacAddress(Context context);

  運行產生命令: javah -jni -d jni -classpath src/ com.fpzeng.example.jni.HellojniActivity,此時提示錯誤:

Error: Cannot determine signature for Context 

這是因爲javah不認識Context類,須要將android.jar包含進來才行。

個人LINUX環境變量中,使用ANDROID_SDK_ROOT指向了當前android-sdk-linux_r24的絕對路徑,你們也須要設置本身的ANDROID SDK環境變量。此時,頭文件的生成命令以下:

javah -jni -d jni -classpath src/:$ANDROID_SDK_ROOT/platforms/android-15/android.jar com.fpzeng.example.jni.HellojniActivity

產生的 com_fpzeng_example_jni_HellojniActivity.h頭文件以下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_fpzeng_example_jni_HellojniActivity */ #ifndef _Included_com_fpzeng_example_jni_HellojniActivity
#define _Included_com_fpzeng_example_jni_HellojniActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_fpzeng_example_jni_HellojniActivity
* Method: nativeGetMacAddress
* Signature: (Landroid/content/Context;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_fpzeng_example_jni_HellojniActivity_nativeGetMacAddress
(JNIEnv *, jobject, jobject);
#ifdef __cplusplus
}
#endif
#endif

加入Android.mk  

每次新加native方法都須要運行該命令,是否是很頭痛?

首先在jni/Application.mk中指定當前的工程路徑,用變量APP_PROJECT_PATH指向。

APP_PROJECT_PATH := $(shell pwd)
APP_CFLAGS+=-Wno-error=format-security
APP_PLATFORM := android-15
APP_ABI := armeabi-v7a
APP_OPTIM := debug

而後在jni/Android.mk 加入響應的參數依賴,以下:

headers:
         $(warning app project path $(APP_PROJECT_PATH)) 
         @cd $(APP_PROJECT_PATH) 
         javah -jni -d jni -classpath src/:$ANDROID_SDK_ROOT/platforms/android-15/android.jar com.fpzeng.example.jni.HellojniActivity

此時運行ndk-build headers,首先打印 aap project path目錄,而後進入該目錄執行javah命令。 

相關文章
相關標籤/搜索