Google JNI 案例-(基於hello-jniCallback)

首先查看CMakeLists
項目路徑 https://github.com/googlesamples/android-ndk/tree/master/other-builds/ndkbuild

# Cmake版本
cmake_minimum_required(VERSION 3.4.1)

# 添加庫 SHARED 
add_library(hello-jnicallback SHARED
            hello-jnicallback.c)

#添加依賴庫
# Include libraries needed for hello-jnicallback lib
target_link_libraries(hello-jnicallback
                      android
                      log)

build_gradle 一般CMakeLists都在module的根目錄下,移動位置後,需要修改path

externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
        }
    }

這邊用到JniHandler 這個用法不錯這個和ShadowSockts中的JNIHelper寫法類似

package com.example.hellojnicallback;

import android.os.Build;
import android.support.annotation.Keep;
import android.util.Log;

/*
 * A helper class to demo that JNI could call into:
 *     private non-static function
 *     public non-static function
 *     static public function
 * The calling code is inside hello-jnicallback.c
 */
public class JniHandler {
    /*
     * Print out status to logcat
     */
    @Keep
    private void updateStatus(String msg) {
        if (msg.toLowerCase().contains("error")) {
            Log.e("JniHandler", "Native Err: " + msg);
        } else {
            Log.i("JniHandler", "Native Msg: " + msg);
        }
    }

    /*
     * Return OS build version: a static function
     */
    @Keep
    static public String getBuildVersion() {
        return Build.VERSION.RELEASE;
    }

    /*
     * Return Java memory info
     */
    @Keep
    public long getRuntimeMemorySize() {
        return Runtime.getRuntime().freeMemory();
    }
}

關於@Keep是android.support.annotation這個包下的

*表示在註釋時不應刪除註釋元素。

*代碼在生成時被縮小。這通常被使用。

*僅通過反射訪問的方法和類

*因此編譯器可能認爲代碼未被使用。

參考資料:https://www.jianshu.com/p/be7ec1819d2f

其實上面說的是 關於混淆的部分 那就不用關心了

#手動啓用support keep註解
#http://tools.android.com/tech-docs/support-annotations
-dontskipnonpubliclibraryclassmembers
-printconfiguration
-keep,allowobfuscation @interface android.support.annotation.Keep

-keep @android.support.annotation.Keep class *
-keepclassmembers class * {
    @android.support.annotation.Keep *;
}

直接看hello-jnicallback.c

內部函數 JNI_OnLoad 初始化調用

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
    JNIEnv* env;
    memset(&g_ctx, 0, sizeof(g_ctx));

    g_ctx.javaVM = vm;
    if ((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_6) != JNI_OK) {
        return JNI_ERR; // JNI version not supported.
    }

    jclass  clz = (*env)->FindClass(env,
                                    "com/example/hellojnicallback/JniHandler");
    g_ctx.jniHelperClz = (*env)->NewGlobalRef(env, clz);

    jmethodID  jniHelperCtor = (*env)->GetMethodID(env, g_ctx.jniHelperClz,
                                                   "<init>", "()V");
    jobject    handler = (*env)->NewObject(env, g_ctx.jniHelperClz,
                                           jniHelperCtor);
    g_ctx.jniHelperObj = (*env)->NewGlobalRef(env, handler);
    queryRuntimeInfo(env, g_ctx.jniHelperObj);

    g_ctx.done = 0;
    g_ctx.mainActivityObj = NULL;
    return  JNI_VERSION_1_6;
}

meset 語句理解

https://blog.csdn.net/pengpengblog/article/details/52593353
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章