★ Android基礎篇 初步NDK開發 .SO文件生成與JIN調用

就是生產個so文件,並且可以調用C裏面的方法。但爲什麼要寫一篇滿論壇多的是的文章呢,就是因爲我踩了N多個坑,希望可以幫助大家,讓大家少走彎路。

先看一下效果圖
這裏寫圖片描述

【1環境的搭建】

NDK沒有的可以去下載 :https://developer.android.com/ndk/downloads/index.html
這裏寫圖片描述
添加完NDK 記得看一下這裏
這裏寫圖片描述
接着看這裏
這裏寫圖片描述
要加上這句代碼:android.useDeprecatedNdk=true 很重要!很重要!

【2 java類編寫的代碼】

public class JniTest {
    static {
        System.loadLibrary("jary");
    }
    public native String getString();
}

然後接着
這裏寫圖片描述

之後你會發現生成了一個JniTest .class文件
這裏寫圖片描述

【3 Terminal 命令】
cd 到mian 文件下 然後 輸入命令:javah -d jni -classpath 自己編譯後的 class 文件的絕對路徑
這裏寫圖片描述

debug 後面是空格!debug 後面是空格!debug 後面是空格!

之後就會生成一個.h的文件
創建一個.c的文件,include後面的是生成.h文件的名字
裏面的(JNIEXPORT jstring JNICALL Java_com_example_lxndk_JniTest_getString)
是.h文件中方法(重寫一下)

#include"com_example_lxndk_JniTest.h"
JNIEXPORT jstring JNICALL Java_com_example_lxndk_JniTest_getString
    (JNIEnv *env, jobject jobject1){
    return (*env)->NewStringUTF(env,"Hello Jin =_=!");
    }

然後–在 build.gradle defaultConfig 中添加如下代碼

  ndk {
            moduleName "jary" //生成的so名字
            abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種abi體系結構下的so庫。

        }

到這裏的jni 調 C 就完成了,但是我想說的是!爲什麼會報這個錯???
這裏寫圖片描述

然後我發現我貌似缺少了東西,Android.mk…
創建Android.mk文件

# 構建系統提供的宏函數 my-dir 將返回當前目錄(包含 Android.mk 文件本身的目錄)的路徑,基本上是固定的,不需要去動
LOCAL_PATH := $(call my-dir)

# 會清除很多 LOCAL_XXX 變量,不會清除 LOCAL_PATH,基本上是固定的,不需要去動
include $(CLEAR_VARS)

# 需要構建模塊的名稱,會自動生成相應的 libNDKSample.so 文件,每個模塊名稱必須唯一,且不含任何空格
LOCAL_MODULE := jary

# 包含要構建到模塊中的 C 或 C++ 源文件列表
LOCAL_SRC_FILES := jary.c

# 指定這個模塊裏會用到哪些原生 API,詳見:https://developer.android.google.cn/ndk/guides/stable_apis.html
LOCAL_LDLIBS := -llog

# 幫助系統將所有內容連接到一起,固定的,不需要去動
include $(BUILD_SHARED_LIBRARY)

這裏寫圖片描述
要改成自己對應的.c 還有構建模塊的名稱

Application.mk

# 選擇不同的 ABI,多個使用空格作爲分隔符,全部是all
# APP_ABI := armeabi armeabi-v7a
APP_ABI := all

# 指定要使用的運行時
APP_STL := gnustl_static

這裏寫圖片描述

最後在 build.gradle android 下 指定目錄!
這裏寫圖片描述

運行效果
這裏寫圖片描述

【4生成so文件】
這裏寫圖片描述

到這裏才基本結束!

源碼地址:https://download.csdn.net/download/macaopark/10340231

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章