Android Studio 生成so文件並調用(客戶端請求接口存放key)

感謝 Android Studio 簡單生成so文件並調用

1.新建MyJni.java

public class MyJni {

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

    public native static String getString();
}

2.生成MyJni的.class文件

點擊一下 make project 會在app的build目錄下面生成MyJni.class文件,不同版本的AS,生成的路徑也不同,只要找到對應生成的路徑並記錄

3.生成 xxx.h 文件

在app/src/main文件夾下新建一個jni文件夾,然後打開Android Studio的終端,cd到這個jni目錄,然後輸入下面的指令:

javah -jni -classpath xxx.xxx.xxx.MyJni(第二步中生成的MyJni.class路徑)

就會在這個jni文件夾下生成一個.h文件,包名_MyJni.h,文件內容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class 包名_MyJni */

#ifndef _Included_包名_MyJni
#define _Included_包名_MyJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     包名_MyJni
 * Method:    getString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_包名_MyJni_getString
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif


4.生成test.c實現上面的.h文件

在jni目錄下新建一個c/c++source file ,取名test.c 實現上面.h文件中的方法

#include "jni.h"
#include "包名_MyJni.h"

JNIEXPORT jstring JNICALL Java_包名_MyJni_getString
  (JNIEnv *env, jclass jz){

  return (*env)->NewStringUTF(env,"此處填寫需要獲取的字符串");

  }

5.生成Android.mk和Application.mk文件

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := MyJni
LOCAL_SRC_FILES := test.c
LOCAL_LDLIBS +=-L$(SYSROOT)/usr/lib -lm -llog
include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_STL := c++_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := all
APP_PLATFORM := android-16

6.下載Android Studio中的NDK

1.直接在工具包中下載
在這裏插入圖片描述
2.我的AS下載不了,不知道爲什麼。所以直接去官網下載了NDK地址
3.下載完成後在project structure中配置NDK路徑
在這裏插入圖片描述
4.配置環境變量
在這裏插入圖片描述

7.生成so文件

然後在終端進入到jni目錄,輸入指令 ndk-build,就會生成相應的so文件

8.調用so文件

在app目錄下的build.gradle的android{}閉包中添加如下代碼:

sourceSets {
        main() {
            jniLibs.srcDirs = ['src/main/libs']
            jni.srcDirs = [] //屏蔽掉默認的jni編譯生成過程
        }
    }

調用方法

String text = MyJni.getString();

獲取到的text就是第四步中填寫的字符串

9.遇到的坑

1.尋找MyJni.class文件,因爲AndroidStudio版本的不同,build的目錄結構不一樣
2.終端切換目錄:cd 路徑
3.生成.mk文件:實在找不到哪個file的類型是.mk結尾,直接在桌面新建一個記事本,改格式爲mk然後複製到項目中
4.ndk-build提示:不是內部或外部命令,是因爲沒有在環境變量配置NDK
5.輸入ndk-build之後提示:Android NDK: WARNING: APP_PLATFORM android-16 is higher than android:minSdkVersion 1 in AndroidManifest.xml。在AndroidManifest.xml文件中加入:

   <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="29" />

這裏填寫的最小和目標版本應該是和build.gradle中一致(沒去研究)
在Application.mk中APP_PLATFORM := android-16這個版本號 不能比你的最小SDK版本大
APP_PLATFORM := android-16這裏的可填版本號是看NDK路徑下的platforms
在這裏插入圖片描述

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