1. 程式人生 > >Android 的嵌入式寫法,呼叫C\C++檔案

Android 的嵌入式寫法,呼叫C\C++檔案

剛剛學了NDK與JNI,肯定是用來呼叫c\c++檔案的,接下來,就給大家帶來一種很簡單的嵌入式呼叫C|C++檔案的一種方法

新建一個工程
在main資料夾下新建一個目錄jni
在jni目錄下新建一個檔案 hello-jni.c

在hello-jni.c 中編寫c程式碼

 #include <jni.h>
        //jstring: 返回值型別 String
        //規則: Java_包名_類名_方法名(jvm虛擬機器的指標,呼叫者物件)
        jstring Java_com_lhy_jnidemo01_MainActivity_helloFromC(JNIEnv* env,jobject thiz){
            return (*env)->NewStringUTF(env, "你好,我來自C程式碼 !!!");
        }


在jni目錄下新建Android.mk檔案

新增如下內容::
#指定編譯的資料夾  指定當前檔案目錄
LOCAL_PATH := $(call my-dir)
#編譯器會定義很多的臨時變數,中間變數,最好清空所有的中間變數。
include $(CLEAR_VARS)
#編譯出來模組的名稱
LOCAL_MODULE    := hello-jni
# 編譯的原始碼的名稱
LOCAL_SRC_FILES := hello-jni.c
#編譯一個動態庫,靜態庫
#靜態庫 檔名.a   包含所有的函式並且函式執行的依賴,體積大,包含所有的API
#動態庫 檔名.so  包含函式,不包含函式執行的依賴,體積小,執行的時候,去作業系統尋找需要的API
include $(BUILD_SHARED_LIBRARY)

在build.gradle中配置

externalNativeBuild {
            ndkBuild {
                path file("src\\main\\jni\\Android.mk")
            }
        }

點選 Make Project(或Ctrl+F9) 即可生成.so檔案

.so檔案的路徑: app\build\intermediates\ndk-build

好了,到這你的so檔案已經生成了,這種方法很簡單,

接下來我們來呼叫c檔案裡的方法,簡單的執行一下。 1、建立NdkJniUtils類


public class NdkJniUtils {
    public native int add(int a,int b);
}
同時加入:
static{
          //System.loadLibrary("庫檔名稱不帶字首,字尾名");
          System.loadLibrary("hello-jni");
        }
2、在MainActivity中呼叫NdkJniUtils



package rise.lung.sow.dra.ndkjni_text;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    NdkJniUtils ndkJniUtils;
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = findViewById(R.id.tv);
        ndkJniUtils = new NdkJniUtils();
        int add = ndkJniUtils.add(2, 6);
        tv.setText(add+"");
    }
}

好了,到這裡就完成了,執行就可以顯示出結果了。

謝謝~~~