NDK实战(二)—— JNI原理(下)

本文深入解析JNI原理,详细介绍了JNI方法的注册流程,从JVM_NativeLoad到JNI_OnLoad,再到Native方法的具体注册实现。通过一个动态注册的native方法实例,阐述了Java中方法定义、JNI中方法映射、gMethod定义、注册方法的编写以及在JNI_OnLoad中的调用过程。
摘要由CSDN通过智能技术生成

JNI原理(下)

一、注册JNI方法

接着上一篇,进入 JVM_NativeLoad 方法

JNIEXPORT jstring JVM_NativeLoad(JNIEnv* env,
                                 jstring javaFilename,
                                 jobject javaLoader,
                                 jstring javaLibrarySearchPath) {
    ...

  std::string error_msg;
  {
    art::JavaVMExt* vm =
    art::Runtime::Current()->GetJavaVM();
    bool success = vm->LoadNativeLibrary(env,
                                         filename.c_str(),
                                         javaLoader,
                                         javaLibrarySearchPath,
                                         &error_msg);
    ...
}

该方法主要做了一件事:

调用Java虚拟机加载nativeLibrary

进入JavaVMExt中查看 LoadNativeLibrary 方法

bool JavaVMExt::LoadNativeLibrary(JNIEnv* env,
                                  const std::string& path,
                                  jobject class_loader,
                                  jstring library_path,
                                  std::string* error_msg) {
  ...
  SharedLibrary* library;
  ...
  void* handle = android::OpenNativeLibrary(env,
                                            runtime_->GetTargetSdkVersion(),
                                            path_str,
                                            class_loader,
                                            library_path,
                                            &needs_native_bridge,
                                            error_msg);

  ...
  
  bool created_library = false;
  {
  //通过创建一个 Android 的 Handle 并用其创建一个 SharedLibrary
    std::unique_ptr<SharedLibrary> new_library(
        new SharedLibrary(env,
                          self,
                          path,
                          handle,
                          needs_native_bridge,
                          class_loader,
                          class_loader_allocator));

    MutexLock mu(self, *Locks::jni_lib
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值