Android JNI之加載第三方so庫(kù)

JNI全稱(chēng)是Java Native Interface,為Java本地接口,是連接Java層與Native層的橋梁。
是連接Java和c的一種語(yǔ)言。

1:cpp文件

路徑:src/main/jni
find_name.cpp
cpp文件就需要jni語(yǔ)言來(lái)編寫(xiě),它的作用是調(diào)用第三方so的.h文件,從而實(shí)現(xiàn)調(diào)用第三方的so庫(kù)。
我這里就先不調(diào)用.h文件了,簡(jiǎn)單返回一下就好了。

#include <jni.h>
#include <string.h>

extern "C"
jstring Java_com_example_aiosceneengine_util_JniUtil_test(JNIEnv* env, jclass thiz) {
    return env->NewStringUTF("不支持(請(qǐng)關(guān)注官方群或本軟件中軟件更新鏈接)");
}

Java_com_example_aiosceneengine_util_JniUtil_test是一種固定的寫(xiě)法。
其中Java:Java去調(diào)用
com_example_aiosceneengine:java項(xiàng)目的包名
JniUtil:調(diào)用這個(gè)JNI類(lèi)的類(lèi)名,
test:對(duì)應(yīng)方法的名字了

2. 導(dǎo)入Android.mk文件

這個(gè)路徑也是src/main/jni

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
 
# 指定so庫(kù)文件的名稱(chēng)
LOCAL_MODULE    := jni_mix
# 指定需要編譯的源文件列表
LOCAL_SRC_FILES := find_name.cpp
# 指定C++的編譯標(biāo)志
LOCAL_CPPFLAGS += -fexceptions
# 指定要加載的靜態(tài)庫(kù)
#LOCAL_WHOLE_STATIC_LIBRARIES += android_support
# 指定需要鏈接的庫(kù)
LOCAL_LDLIBS    := -llog
 
include $(BUILD_SHARED_LIBRARY)
$(call import-module, android/support)

3.配置build.gradle

android -> defaultConfig 下添加

 ndk {
            // 設(shè)置支持的SO庫(kù)架構(gòu),第三方給的so庫(kù)哪幾種架構(gòu),就配置這幾種架構(gòu)
            abiFilters 'arm64-v8a'
        }

android 下添加

  externalNativeBuild {
        ndkBuild {
            path file('src/main/jni/Android.mk')
        }
    }
    packagingOptions{
        pickFirst 'lib/arm64-v8a/libjni_mix.so'
    }

sourceSets 下添加

  sourceSets {
        main {
            jni.srcDirs = []
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
4.編譯項(xiàng)目

路徑在: build → intermediates → ndkBuild → debug → obj → local下

5.將生成的so拷入src/main/jniLibs中
圖片.png
6.調(diào)用C代碼
package com.example.aiosceneengine.util;

import android.util.Log;

public class JniUtil {
    //native表示是加載的jni方法
    public static native String test();

    static {
        //一定要記得加載so
        System.loadLibrary("jni_mix");
    }

    public static void myTest() {
        new Thread(() -> {
            String str = test();
            Log.v("TAG", "HAHA:" + str);
        }).start();
    }
}
7.成功調(diào)用
圖片.png
8.調(diào)用第三方so庫(kù)

待更新......

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容