美文网首页
Android JNI

Android JNI

作者: 一航jason | 来源:发表于2021-08-12 11:13 被阅读0次
public class MainActivity extends AppCompatActivity {


    static {
        System.loadLibrary("native-lib");
    }
    public native String stringFromJNI();//静态注册
    public native String sayHello(int age);//动态注册
    public void msg(final String msg){//被jni调用方法
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this, msg , Toast.LENGTH_LONG).show();
            }
        });
    }
}
#include <jni.h>
#include <string>

static void outMsg(JNIEnv *env, jobject thiz, const char *msg);

//静态注册
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_jnigetvideoaudio_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject thiz) {
    std::string hello = "Hello from C++";
    outMsg(env, thiz, hello.c_str());
    return env->NewStringUTF(hello.c_str());
}


//动态注册方法
static jstring sayHello(JNIEnv *env, jobject thiz, int num) {
    char name[200] = "jason liyihang";
    sprintf(name, "%s---%i", name, num);
    outMsg(env, thiz, name);
    return env->NewStringUTF(name);
}


//动态注册函数指针列表
static JNINativeMethod javaMethods[] = {
        {"sayHello", "(I)Ljava/lang/String;", (void *) sayHello}
};


//System.loadLibrary("native-lib"); 调用是出发这个方法
jint JNI_OnLoad(JavaVM *vm, void *unused) {
    JNIEnv *env = NULL;
    //获取环境结构体
    if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {
        return -1;
    }

    //对应java类  .换/
    const char *className = "com/example/jnigetvideoaudio/MainActivity";
    int methodNum = sizeof(javaMethods) / sizeof(JNINativeMethod);

    jclass clazz = env->FindClass(className);
    if (clazz == NULL) {
        return -1;
    }

    //动态注册方法
    int ret = env->RegisterNatives(clazz, javaMethods, methodNum);
    if (ret < 0) {
        env->DeleteLocalRef(clazz);
        return -1;
    }

    //释放变量
    env->DeleteLocalRef(clazz);

    return JNI_VERSION_1_6;
}

//c调用java方法
static void outMsg(JNIEnv *env, jobject thiz, const char *msg) {
    jclass clazz = env->GetObjectClass(thiz);
    jmethodID mid = env->GetMethodID(clazz, "msg", "(Ljava/lang/String;)V");
    jstring outString = env->NewStringUTF(msg);
    env->CallVoidMethod(thiz, mid, outString);
    env->DeleteLocalRef(clazz);
}




jni1.png jni2.png

相关文章

网友评论

      本文标题:Android JNI

      本文链接:https://www.haomeiwen.com/subject/rwflbltx.html