Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android NDK 開發

Android NDK 開發

編輯:關於Android編程

說到 NDK 開發,其實是為了有些時候為了項目需求需要調用底層的一些 C/C++ 的一些東西;另外就是為了效率更加高些。谷歌主力推動 Android Studio 這個是個不錯的工具,至少現在來看在 Eclipse 上能做到的 這邊都有,這邊有的Eclipse上不一定有。但是為了復習,兩個IDE都記錄一下。

准備工作

去官網下載NDK,這個需要翻牆,下面發放福利了。

http://yunpan.cn/cdFTKe3Ty4D9e 訪問密碼 6776(Android-ndk-r10e0) http://yunpan.cn/cdFTQAmSAI9sY 訪問密碼 f594(我下載的翻牆工具,勉強過得去)

下載好了ndk,雙擊解壓到當前目錄,貌似時間有點忽悠人,耐心等待一下。接下來我們可以開始NDK開發了。之前我們可以去ndk目錄下找samples,找官網給的例子。學習ing中……先從Eclipse開始吧。

一、Eclipse DNK開發

1、建立一個項目HelloNDK

在Activity 中寫一個native方法

public class MainActivity extends Activity {

    static{
        System.loadLibrary(hello);
    }
    /**
     * native 
     * @return
     */
    public static native String getStringFromC();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView text = (TextView) findViewById(R.id.textView);
        text.setText(getStringFromC());
    }
}

寫好了native方法後。來到java目錄,執行javah命令,生成c/c++所需要的頭文件xxx.h
這裡寫圖片描述

-classpath 是項目bin目錄下class文件
-d 輸出目錄(jni,是我剛才在工程目錄下建好的jni文件夾)<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;"> **xxx/xxx/xxx.h文件** extern C { /* * Class: com_example_jnindk_MainActivity * Method: getStringFromC * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_jnindk_MainActivity_getStringFromC (JNIEnv *, jclass); #ifdef __cplusplus }

之後去官網的例子jni文件夾把Android.mk,application.mk復制到現在的工程jni文件夾。

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.c

include $(BUILD_SHARED_LIBRARY)

注意LOCAL_MODULE本地的moduleName。LOCAL_SRC_FILES本地寫的c文件。

2、我們在jni文件夾中寫一個hello.c文件

#include
#include
#include com_example_jnindk_MainActivity.h

JNIEXPORT jstring JNICALL Java_com_example_jnindk_MainActivity_getStringFromC
  (JNIEnv * env, jclass jclass){

     return (*env)->NewStringUTF(env, Hello from the world !);
};

返回一個字符串。仔細看類名,第一個是Java,接下是包名+類名+方法名。這裡包名跟我cmd中寫的類名不一樣,失誤,上面是我隨便寫的,注意一下就可以。

3、生成so文件
這裡寫圖片描述

成功後會在工程目錄生成一個obj文件夾,這裡可以找到so文件。
這裡寫圖片描述
做過百度地圖的朋友們有沒有看到so,感到很親切。接下我們就去Maintivity中調用了。

static{
        System.loadLibrary(hello);
    }

測試通過。

二、下面把NDK開發切換到Android studio下。

前面的步驟差不多,只是不需要我們敲命令去生成so文件,我們在build.gradle中去配置就可以了。
這裡寫圖片描述

注意ndk的位置,defaultConfig下面。
這裡寫圖片描述

ndk的位置

剛在Eclipse中我們手動命令生成so文件,as只需要配置重新build的時候這個so文件生成都哪兒去了呢。請看。
這裡寫圖片描述
看lib,so文件移植到這麼多的APP_ABI裡面。這是如何做到的,我們發現application.mk中的配置。和build.gradle中ndk的配置。

APP_ABI := APP_ABI := armeabi armeabi-v7a arm64-v8a x86 x86_64 mips mips64

APP_PLATFORM := android-

三:錯誤總結
1、`Error:Execution failed for task ‘:app:compileDebugNdk’.

com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘D:Usershtj-123AppDataLocalAndroidandroid-ndk-r10b dk-build.cmd” finished with non-zero exit value 2`

這個是我工程目錄有空格導致的。

2、Process: com.eddie.ndk, PID: 23210
java.lang.UnsatisfiedLinkError: Native method not found: com.eddie.ndk.MainActivity.getStringFromC:()Ljava/lang/String;

1) Android.mk裡面:
最後生成的時候
LOCAL_MODULE := testcmmb_jni 千萬不能寫成 libtestcmmb_jni!!!!雖然編譯出來的文件名稱貌似相同
2) C++ 的代碼裡面:
extern “C”{
。。。
}
這是因為生成的二進制文件中,C和C++的符號表不相同造成的。Jni是按照C的生成規則去找函數的, 所以要加上extern C使編譯器把函數按照C的規則編譯 這樣才能被JAVA調用

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved