1. 程式人生 > >android studio呼叫c檔案-小白版本

android studio呼叫c檔案-小白版本

你是小白麼 是的話開始看吧

你是高手就不用看了 因為 不是給你寫的 滾滾滾 一邊玩去

1  首先  開始只有一條狗 裝備全靠撿

...準備好你的.cpp檔案  和.h檔案

UDPAPI.cpp   udpapi.h

   這個地方介紹一下android.mk

當然 我啥也不懂 只能貼程式碼

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE:=udpapi
LOCAL_SRC_FILES:=UDPAPI.cpp

include $(BUILD_SHARED_LIBRARY)


2準備的這3個檔案 放在    android studio       project檢視下面  src main jni目錄下

下面搭建 ndk 開發環境

    alt+ctrl+s 進入設定介面 然後 輸入sdk  進來到這裡 勾選 下面三項 並且下載


下面這一步  是在~~~~~~主!!!!!Project的gradle.properties  下面新增  

android.useDeprecatedNdk=true
同步一下
檢測是否關聯完畢 就檢視 主local.properties

如果是這個樣子

ndk.dir=C\:\\Users\\liuan\\AppData\\Local\\Android\\Sdk\\ndk-bundle
sdk.dir=C\:\\Users\\liuan\\AppData\\Local\\Android\\Sdk
那就是木有問題

如果不是

請把滑鼠移動到你的model名字上面 按下f4  然後 點選左上角  sdk Location  

然後觀察您的ndk location  是不是對的 我的是C:\Users\liuan\AppData\Local\Android\Sdk\ndk-bundle

好啦好啦 

下一步配置環境變數 

就是把C:\Users\liuan\AppData\Local\Android\Sdk\ndk-bundle加到path裡 環境變數不會配置的話 ...你不會是妹子吧....加個qq唄..

配置好了的話

下一步

本 model下

android {
    compileSdkVersion 24
    buildToolsVersion '25.0.0'

    defaultConfig {
        ...
        versionCode 1
        versionName "1.0"
// add 1
        ndk {
            moduleName "libudpapi"
        }
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        ....//add 2
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
    }

新增這兩個東西

下一步

滑鼠移動到 jni目錄 右鍵點選一下 Show in Explorer

來到這個目錄 找個空白的地方 按住shift 然後滑鼠右鍵 在此處開啟命令視窗

輸入我們做夢都想輸入的程式碼ndk-build回車

如果這個命令列 在你的libs 下面生成了很多東西 .so的那種 恭喜你 大概是成功了

[arm64-v8a] Compile++      : udpapi <= UDPAPI.cpp
[arm64-v8a] SharedLibrary  : libudpapi.so
[arm64-v8a] Install        : libudpapi.so => libs/arm64-v8a/libudpapi.so
[x86_64] Compile++      : udpapi <= UDPAPI.cpp
[x86_64] SharedLibrary  : libudpapi.so
[x86_64] Install        : libudpapi.so => libs/x86_64/libudpapi.so
[mips64] Compile++      : udpapi <= UDPAPI.cpp
[mips64] SharedLibrary  : libudpapi.so
[mips64] Install        : libudpapi.so => libs/mips64/libudpapi.so
[armeabi-v7a] Compile++ thumb: udpapi <= UDPAPI.cpp
[armeabi-v7a] SharedLibrary  : libudpapi.so
[armeabi-v7a] Install        : libudpapi.so => libs/armeabi-v7a/libudpapi.so
[armeabi] Compile++ thumb: udpapi <= UDPAPI.cpp
[armeabi] SharedLibrary  : libudpapi.so
[armeabi] Install        : libudpapi.so => libs/armeabi/libudpapi.so
[x86] Compile++      : udpapi <= UDPAPI.cpp
[x86] SharedLibrary  : libudpapi.so
[x86] Install        : libudpapi.so => libs/x86/libudpapi.so
[mips] Compile++      : udpapi <= UDPAPI.cpp
[mips] SharedLibrary  : libudpapi.so
[mips] Install        : libudpapi.so => libs/mips/libudpapi.so

下一步

生成本地方法 呼叫自己的c程式碼

package com.example.aaaa.utils;

public class JniTest {
    public native int init(int a);

    public native double getZhiJing(int ceAX, int ceBX, int ceAY, int ceBY, int windowHeight, int larseY, double YQGD);

    public native double getXiangsucha(int windowHeight, int larseY);

    public native double getJuLi(double jiaoju, double YQGD, double xiangsucha);

    public native int zAdd(int a, int b);

    static {
        System.loadLibrary("udpapi");
    }

    public static void main(String args[]) {

        JniTest jniTest = new JniTest();
        System.out.println("zAdd: " + jniTest.zAdd(1, 2));
        System.out.println("getZhiJing: " + jniTest.getZhiJing(1, 2, 3, 4, 4, 5, 7));
        System.out.println("getXiangsucha: " + jniTest.getXiangsucha(1, 2));
        System.out.println("getJuLi: " + jniTest.getJuLi(1, 2, 3));

    }
}  

這裡的main方法是不會執行的....錯誤示範  

我為什麼不刪除呢  是因為想告訴大家  這個這個這個一定不要在java裡面呼叫 在activity裡面呼叫

pass:這個地方肯定以為已經成功了  當時我伸手就是一巴掌.......還遠著呢 步驟我寫的都是錯的 你能做對 我服你

大家注意沒  這個包名 我都貼出來了

下一步是 改.cpp檔案的方法名稱

用java開頭 用方法名結尾

中間是這麼幹滴

Java_com_example_aaaa_utils_JniTest_zAdd

改完這一個 把其他的也改了
然後從新ndk-build
然後從activity中呼叫  
為什麼我要把順序寫的不對  
因為 這是我走錯的路..................你們不跟著看一看嘛?