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