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中呼叫
為什麼我要把順序寫的不對
因為 這是我走錯的路..................你們不跟著看一看嘛?