All Projects → HuTianQi → Jnioor

HuTianQi / Jnioor

基于C++模板函数与Fluent API设计的JNI反射库,极大的简化JNI反射调用,提高JNI开发效率与稳定性

Projects that are alternatives of or similar to Jnioor

SecurityDemo
ndk进行简单的签名校验,密钥保护demo,android应用签名校验
Stars: ✭ 22 (-92.09%)
Mutual labels:  ndk, jni
Jni4android
JNI Generater for Android
Stars: ✭ 261 (-6.12%)
Mutual labels:  ndk, jni
Googleserialport
Android串口通信:抱歉,学会它真的可以为所欲为 ! ! !
Stars: ✭ 130 (-53.24%)
Mutual labels:  ndk, jni
Anyndk
🔥 Android native library, make your development faster and easier. Android各种native库,让你的开发更快更简单
Stars: ✭ 35 (-87.41%)
Mutual labels:  ndk, jni
ChangeVoice
NDK语音消息的变声处理
Stars: ✭ 33 (-88.13%)
Mutual labels:  ndk, jni
Android Luajit Launcher
Android NativeActivity based launcher for LuaJIT, implementing the main loop within Lua land via FFI
Stars: ✭ 87 (-68.71%)
Mutual labels:  ndk, jni
Androidsecurity
Android安全实践
Stars: ✭ 150 (-46.04%)
Mutual labels:  ndk, jni
Native Opencv Android Template
A tutorial for setting up OpenCV 4.5.0 (and other 4.x.y version) for Android in Android Studio with Native Development Kit (NDK) support.
Stars: ✭ 131 (-52.88%)
Mutual labels:  ndk, jni
Android Disassembler
Disassemble ANY files including .so (NDK, JNI), Windows PE(EXE, DLL, SYS, etc), linux binaries, libraries, and any other files such as pictures, audios, etc(for fun)files on Android. Capstone-based disassembler application on android. 안드로이드 NDK 공유 라이브러리, Windows 바이너리, etc,... 리버싱 앱
Stars: ✭ 250 (-10.07%)
Mutual labels:  ndk, jni
Relinker
A robust native library loader for Android.
Stars: ✭ 2,612 (+839.57%)
Mutual labels:  ndk, jni
Keepalive
Fighting against force-stop kill process on Android with binder ioctl / Android高级保活
Stars: ✭ 376 (+35.25%)
Mutual labels:  ndk, jni
Camera2GLPreview
Android camera preview application using Camera2 API and OpenGL ES/Vulkan
Stars: ✭ 140 (-49.64%)
Mutual labels:  ndk, jni
Jni.hpp
A modern, type-safe, header-only, C++14 wrapper for JNI
Stars: ✭ 313 (+12.59%)
Mutual labels:  ndk, jni
Androiddevwithcpp
Android Develop With C++
Stars: ✭ 106 (-61.87%)
Mutual labels:  ndk, jni
Jpegkit Android
Efficient JPEG operations for Android without the risk of an OutOfMemoryException.
Stars: ✭ 154 (-44.6%)
Mutual labels:  ndk, jni
NativeGL demo
此程序使用android native代码实现EGL,并使用SurfaceView作为OpenGL绘图窗口。即可提高图形渲染性能,又可使用java层定义的图形界面
Stars: ✭ 43 (-84.53%)
Mutual labels:  ndk, jni
premake-android-studio
premake5 module for android-studio and gradle build.
Stars: ✭ 24 (-91.37%)
Mutual labels:  ndk, jni
jni
V wrapper around the C Java Native Interface
Stars: ✭ 15 (-94.6%)
Mutual labels:  jni
jni-bindgen
Generate Rust JVM FFI wrappers around APIs defined by .jar or .class files, because maintaining your own hand-written bindings is an exercise in boredom, soundness bugs, and pain.
Stars: ✭ 55 (-80.22%)
Mutual labels:  jni
QQVoiceChange
Android NDK项目,继承 fmod音频引擎 实现仿QQ变声效果,可实现对录音进行变声,如 萝莉、大叔、搞怪、惊悚、空灵等效果,带领大家熟悉使用Android Studio+ CMake 集成 fmod 等C/C++框架的流程。
Stars: ✭ 26 (-90.65%)
Mutual labels:  ndk

JNIOOR

基于C++模板函数与Fluent API设计的JNI反射库,极大的简化JNI反射调用。

设计目标

  • 弱化数据类型概念,强化操作意图

    在执行中间任何操作的时候无需关心数据类型,内部会依据传入的参数签名自动调用对应数据类型的原JNI函数,只需要在最终进行get操作与set操作时通过泛型指定数据类型

在执行中间操作时只需关注操作意图,即:

  1. 对什么操作:on
  2. 操作什么:构造函数用construct,域用field,静态域用staicField,函数调用用call,静态函数调用用staticCall
  3. 最终目的:获取值用get,修改值用set

功能特性

  • 基于OOD设计的Fluent API:

    int intField = Reflect::on(env, object).field("intField", "I").get<jint>(); // 获取Filed
    Reflect::on(env, object).field("intField", "I").set<jint>(1); // 设置Field
    jobject object = Reflect::on(env, "tech/huqi/jnioor/Sample").construct("()V").get<jobject>();   // 调用构造函数
    jstring content = Reflect::on(env, object).call("toString","()Ljava/lang/String;").get<jstring>(); // 调用toString函数
    
  • 完善的判空与异常检测逻辑

    当执行JNI函数的GetFieldID,GetMethodID,CallXxxMethod,CallStaticXxxMethod调用时,如果获取的域,方法,调用的方法不存在时会抛出异常导致程序奔溃

    这在对一些非官方系统(如非安卓原生,java原生)的类进行JNI调用时很常见,比如Xposed检测,如果你的代码运行在一个未安装Xposed框架的机器上,那么关于Xposed的域,方法操作都会出现异常导致崩溃。所以一个健壮稳定的JNI调用一般类似这样:

    jclass jcls_Sample = env->FindClass("tech/huqi/jnioor/Sample");
    if (jcls_Sample != NULL) {
        jmethodID jmid_init = env->GetMethodID(jcls_Sample, "<init>", "()V");
        if (jmid_init != NULL) {
            jobject job_Sample = env->NewObject(jcls_Sample, jmid_init);
            if (job_Sample != NULL) {
                jfieldID jfid_intField = env->GetFieldID(jcls_Sample, "intField", "I");
                if (jfid_intField != NULL) {
                    int intField = env->GetIntField(job_Sample, jfid_intField);
                    // ...... 省略后续其他逻辑
                } else {
                    checkAndClearException(env);// 检测并清理异常
                }
            } else {
                checkAndClearException(env);// 检测并清理异常
            }
        } else {
            checkAndClearException(env);// 检测并清理异常
        }
    } else {
        checkAndClearException(env);// 检测并清理异常
    }
    env->DeleteLocalRef(jcls_Sample); // 释放局部引用
    

    即对三方框架的类进行JNI调用时进行判空或异常检测后再进行下一步操作,如果为空进行异常检测并清理,如果中间产生了一些临时局部引用,还需要释放局部引用。但这样做代码结构嵌套太深,不利于阅读与后期维护,虽然这种嵌套可以采用goto语句来避免

    现在有了这个库,只需要这样就包含了上述代码的功能:

    jobject object = Reflect::on(env, "tech/huqi/jnioor/Sample").construct("()V").get<jobject>();
    if(object!=NULL){
        int intField = Reflect::on(env, object).field("intField", "I").get<jint>();
    }
    

示例

(以下示例基于文档最后的Sample类进行操作)

// 获取非态域
int intField = Reflect::on(env, object).field("intField", "I").get<jint>();
long longField = Reflect::on(env, object).field("longField", "J").get<jlong>();
float floatField = Reflect::on(env, object).field("floatField", "F").get<jfloat>();
double doubleField = Reflect::on(env, object).field("doubleField", "D").get<jdouble>();
jstring stringField = Reflect::on(env, object).field("stringField",
                                                         "Ljava/lang/String;").get<jstring>();
                                                         
 // 获取静态域
 int staticIntField = Reflect::on(env, clazz).staticField("staticIntField",
                                                             "I").get<jint>();
 long staticLongField = Reflect::on(env, clazz).staticField("staticLongField",
                                                               "J").get<jlong>();
 float staticFloatField = Reflect::on(env, clazz).staticField("staticFloatField",
                                                                 "F").get<jfloat>();
 double staticDoubleField = Reflect::on(env, clazz).staticField("staticDoubleField",
                                                                   "D").get<jdouble>();
 jstring staticStringField = Reflect::on(env, clazz).staticField("staticStringField",
                                                                    "Ljava/lang/String;").get<jstring>();
         
 // 设置非静态域
 Reflect::on(env, object).field("intField", "I").set<jint>(1);
 Reflect::on(env, object).field("longField", "J").set<jlong>(1);
 Reflect::on(env, object).field("floatField", "F").set<jfloat>(1.0f);
 Reflect::on(env, object).field("doubleField", "D").set<jdouble>(1.0);
 Reflect::on(env, object).field("stringField", "Ljava/lang/String;").set<jobject>(
            env->NewStringUTF("modify stringField value"));
            
 // 设置静态域
 Reflect::on(env, clazz).staticField("staticIntField", "I").set<jint>(1);
 Reflect::on(env, clazz).staticField("staticLongField", "J").set<jlong>(1);
 Reflect::on(env, clazz).staticField("staticFloatField", "F").set<jfloat>(1.0f);
 Reflect::on(env, clazz).staticField("staticDoubleField", "D").set<jdouble>(1.0);
 Reflect::on(env, clazz).staticField("staticStringField","Ljava/lang/String;").set<jobject>(
            env->NewStringUTF("modify staticStringField value"));
 // 调用构造函数
 jobject object = Reflect::on(env, clazz).construct("()V").get<jobject>();
 // 调用函数
 jstring content = Reflect::on(env, object).call("toString","()Ljava/lang/String;").get<jstring>();

Sample类

public class Sample {
    private static final String TAG = "JniReflectSample";
    private int intField = 0;
    private static int staticIntField = 0;

    private long longField = 0;
    private static long staticLongField = 0;

    private float floatField = 0.1f;
    private static float staticFloatField = 0.1f;

    private double doubleField = 0.1;
    private static double staticDoubleField = 0.1;

    private String stringField = "this is a non-static String";
    private static String staticStringField = "this is a static String";

    public static native void nativePrint();

    public int getIntField() {
        return intField;
    }

    public long getLongField() {
        return longField;
    }

    public float getFloatField() {
        return floatField;
    }

    public double getDoubleField() {
        return doubleField;
    }

    public String getStringField() {
        return stringField;
    }

    @Override
    public String toString() {
        return "Sample{" +
                "intField=" + intField +
                ", longField=" + longField +
                ", floatField=" + floatField +
                ", doubleField=" + doubleField +
                ", stringField='" + stringField + '\'' +
                ", staticIntField=" + staticIntField +
                ", staticLongField=" + staticLongField +
                ", staticFloatField=" + staticFloatField +
                ", staticDoubleField=" + staticDoubleField +
                ", staticStringField='" + staticStringField + '\'' +
                '}';
    }
}

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].