首先查看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