首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从Java代码通过.net调用JNI不返回

从Java代码通过.NET调用JNI不返回是指在Java程序中调用了使用JNI(Java Native Interface)编写的.NET代码,但是没有收到预期的返回值。

Java Native Interface(JNI)是Java提供的一种机制,用于在Java程序中调用非Java代码(如C、C++、C#等),以实现Java与其他语言之间的交互。通过JNI,可以在Java程序中调用外部代码,并且可以传递参数和接收返回值。

当从Java代码通过JNI调用.NET代码时,可能会出现不返回的情况,可能的原因如下:

  1. 调用的.NET方法未正确实现返回值:在.NET代码中,可能存在未正确实现返回值的情况,导致调用JNI时无法获取到预期的返回结果。在这种情况下,需要检查.NET代码中是否正确设置了返回值。
  2. JNI调用过程中发生异常:在JNI调用过程中,可能会发生异常导致返回结果丢失。异常可能是由于JNI代码错误、参数传递错误、内存访问错误等引起的。在这种情况下,需要检查JNI代码是否正确处理异常情况,并进行相应的异常处理。
  3. JNI调用的.NET方法未正确声明:在Java代码中调用JNI时,需要正确声明要调用的.NET方法,包括方法名称、参数类型和返回值类型等。如果声明不正确,可能导致无法获取到返回值。在这种情况下,需要检查Java代码中JNI方法声明是否正确,并与.NET代码进行对应。

对于以上情况,可以采取以下解决方法:

  1. 检查.NET代码实现:确保调用的.NET方法正确实现返回值。查看.NET代码是否正确设置了返回值,并检查相关逻辑是否正确。
  2. 检查JNI代码:检查JNI代码是否正确处理异常情况,并进行相应的异常处理。确保JNI代码与.NET方法之间的参数传递正确,以及正确声明JNI方法。
  3. 调试和日志记录:在调用过程中添加调试信息和日志记录,以便跟踪和排查问题。通过输出相关信息,可以更好地定位问题所在。

此外,如果你需要在腾讯云上进行云计算相关的开发和部署,腾讯云提供了丰富的云产品和解决方案。你可以访问腾讯云官网(https://cloud.tencent.com/)了解更多关于腾讯云的产品和服务,以及适用的应用场景。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JNIJava代码调用本地代码

JNI概述 JNIJava Native Interface 的简称 Java是跨平台的编程语言,但是在有些时候仍然是有需要调用本地代码(这些代码通常是由 C 与 C++ 编写的)。...JNIJava 平台的一个功能强大的接口。这个 JNI接口提供了Java与操作系统本地代码相互调用的功能。 2....C/C++代码的步骤 在 Java 类中声明一个native方法 public native void sayHello(); 使用 javah 命令生成包含 native 方法声明的C/C++头文件...使用JNI弊端 使用了 JNI,那么这个Java Application 将不能跨平台了。如果需要移植到别的平台上,那么需要重新编写native代码 Java 是强类型的语言,而 C/C++并不是。...因此,在编写JNI时要更小心 总之,必须在构建Java程序的时候,尽量少用本地代码 Visual studio环境配置://www.cnblogs.com/sysu-huangwei/p/7466481

1.5K30

JNI:本地代码调用Java代码

本地代码访问Java代码 在被调用的C/C++函数中也可以反过来访问Java程序中的方法 javah 工具生成的C/C++函数声明中,可以看到有两个参数: JNIEXPORT void JNICALL...JNIEnv 类型 JNIENV类型实际上代表了Java环境,通过这个JNIEnv*指针,就可以对Java端的代码进行操作。...例如,创建Java类的对象、调用Java对象的方法、获取Java对象的属性等。JNIEnv的指针会被JNI传入到本地方法的实现函数中来对Java端的代码进行操作。...访问Java类中的属性与方法 在C/C++本地代码中访问Java端的代码,一个常见的场景就是获取类的属性和调用类的方法。...为了在C/C++中表示属性和方法,JNIjni.h头文件中定义了jfieldID和jmethdID类型来分别代表Java端的属性和方法 在访问,或者设置Java属性的时候,首先就要先在本地代码中获得代表

1.6K20
  • Android 通过 JNI 访问 Java 字段和方法调用

    在前面的两篇文章中,介绍了 Android 通过 JNI 进行基础类型、字符串和数组的相关操作,并描述了 Java 和 Native 在类型和签名之间的转换关系。...方法调用 JNI 调用 Java 方法和 JNI 访问 Java 字段的步骤也大致相同, 获取 Java 对象的类 获取对应方法的 id 调用具体的方法 以调用类的实例方法和静态方法为例: 调用类的实例方法...JNI 调用 Java 类的实例方法 private native void callInstanceMethod(Animal animal); 对应 C++ 代码如下: // Native...对于不需要返回值的函数,调用 CallVoidMethod 即可,对于返回值为引用类型的,调用 CallObjectMethod 方法,对于返回基础类型的方法,则有各自对应的方法调用,比如:CallBooleanMethod...小结 可以看到, JNI 中访问 Java 的字段和访问,两者的步骤都是大致相似的,只是调用JNI 方法有所区别。 具体示例代码可参考我的 Github 项目,欢迎 Star。

    1.1K10

    Android 通过 JNI 调用 Java 类的构造方法和父类的方法

    Android 还可以通过 JNI调用 Java 一个类的构造方法,从而创建一个 Java 类。 调用构造方法 调用构造方法的步骤和之前调用类的实例方法步骤类似,也需要获得对应的类和方法 id。...对于构造方法,它的方法 id 还是通过 GetMethodID 方法来获得,但是构造方法对应的名称为 ,返回值类型是 void 类型的。...除了 NewObject 方法之外,JNI 还提供了 AllocObject 方法来创建对象,以同样调用 Animal 类构造方法为例: /** * 通过 AllocObject 方法来创建一个类...通过这种方法,同样可以创建一个 Java 中的类。 调用父类的方法 可以通过 JNI调用父类的实例方法。...由此,通过 JNI调用 Java 算是基本完成了。 具体示例代码可参考我的 Github 项目,欢迎 Star。

    2.7K20

    JNI线程相关

    例如,最好使用 Java 编程语言在两个线程之间进行回调(其中一个线程发出阻塞 C++ 调用,然后在阻塞调用完成时通知界面线程),而不是通过 JNI 使用 Java 代码的界面线程调用 C++ 函数。...一种比较常见的应用场景是:在native 层创建了线程,线程执行完后想将结果返回java层,这时线程是不能用jni函数参数中的JNIEnv的,因为参数中的JNIEnv属于不同的线程....线程通常受管理代码启动(使用 Thread.start()),但也可以在其他位置创建,然后附加到 JavaVM。...在附加之前,线程包含任何 JNIEnv,也无法调用 JNI.在已附加的线程上调用 AttachCurrentThread() 属于空操作。...函数返回后局部引用所引用的对象会被JVM自动释放. 通过NewLocalRef创建的局部引用,如果不通过函数返回,需要调用DeleteLocalRef释放。

    1.4K20

    实现一个在JNI调用Java对象的工具类,从此一行代码就搞定!

    前言 我们知道在jni中执行一个java函数需要调用几行代码才行,如 jclass objClass = (*env).GetObjectClass(obj); jmethodID methodID...jni执行某个java函数的时候,就一行代码就可以搞定了,比如String.length(): jint len = callIntMethod(env, str, "length", "()I")...优化 通过上面可以看到这些函数大部分代码都非常类似,只有一行代码返回值有区别,所以我考虑使用函数模版来进行优化,如下: template T callMethod(JNIEnv...而在jni中,与java对应的类型其实就那么十几种,所以我们只要全部实现一遍call2Result即可。...总结 上面我们仅仅是实现了调用普通函数的工具,根据这个思路我们还可以实现调用静态函数、获取成员变量、赋值成员变量等,这样当我们在进行jni开发的时候,如果需要对java对象或类进行操作,只需要一行代码就可以了

    1.9K20

    Object类中的registerNatives方法的作用深入介绍

    通过以上内容,我们了解到,一个Java程序要想调用一个本地方法,需要执行两个步骤:第一,通过System.loadLibrary()将包含本地方法实现的动态文件加载进内存;第二,当Java程序需要调用本地方法时...其实,除了这三点好处,上面的红色部分还提到了第四点好处:通过registerNatives()方法,在定义本地方法实现的时候,可以遵守JNI命名规范。那什么是JNI命名规范呢?...由博文10可知,JNIEnv类型实际上代表了Java环境,通过这个JNIEnv* 指针,就可以对Java端的代码进行操作。...例如,创建Java类中的对象,调用Java对象的方法,获取Java对象中的属性等等。JNIEnv的指针会被JNI传入到本地方法的实现函数中来对Java端的代码进行操作。...Type的方法 CallStaticMethod:调用返回值类型为Type的static方法等。

    39150

    我敢说:99.9%的程序员根本没在项目中使用过Java的这个功能!

    为了能够和使用C和C++写的程序进行交互,Java提供了本地方法的特性,也就是我们常说的JNI技术,然而,随着互联网的高速发展,分布式、微服务、大数据、云计算等技术和框架层出穷,大多数支持多语言的框架基本上都是都过...为何使用JNI 最近,冰河在分析500多TB的数据,500多TB的数据中分析用户的行为习惯,以便为用户提供更好的产品体验和推荐更加适合用户的产品。...如何使用JNI 先说说使用JNI时有哪些坑吧,以避免小伙伴们重复踩坑,这里,大家需要注意的是:在使用JNI技术调用dll动态链接库时,32位dll只能是32位JDK去调用,64位dll只能是64位JDK...-- https://mvnrepository.com/artifact/net.java.dev.jna/jna --> net.java.dev.jna...-- https://mvnrepository.com/artifact/net.java.dev.jna/jna-platform --> net.java.dev.jna

    16010

    Java中一个逐渐被遗忘的强大功能,强到你难以置信!!

    为了能够和使用C和C++写的程序进行交互,Java提供了本地方法的特性,也就是我们常说的JNI技术,然而,随着互联网的高速发展,分布式、微服务、大数据、云计算等技术和框架层出穷,但大多数框架采用单一的语言所开发...先说说使用JNI时有哪些坑吧,以避免小伙伴们重复踩坑,这里,大家需要注意的是:在使用JNI技术调用dll动态链接库时,32位dll只能是32位JDK去调用,64位dll只能是64位JDK去调用。...为了能够让小伙伴们顺利的按照文章开发出自己的JNI程序,这里,我就详细的说下如何开发一个JNI程序,主要分三个大的方面来说明如何使用JNI技术调用C和C++写的程序。 ?...-- https://mvnrepository.com/artifact/net.java.dev.jna/jna --> net.java.dev.jna...-- https://mvnrepository.com/artifact/net.java.dev.jna/jna-platform --> net.java.dev.jna

    45620

    深入Android源码系列(一)

    这里NATIVE_METHOD是个宏定义 于是 会转化为 这个就是jni编写中,需要配置的对应表,主要完成java和c语言函数对应,参数和返回值对应的关系,给了这些,虚拟机才会在java和c之间建立起来关系...,知道哪个java函数调用的真正正确的c语言函数,同时c也是可以反向调用java的,更多可以百度jni的编写。...FindSymbol("JNI_OnLoad")完成找出so里面的JNI_OnLoad方法,如果有,使用(*jni_on_load)(this, nullptr)调用返回so使用的java版本。...此段代码,完成在此app的本地so库的搜索路径下,查找我们的test_jni动态库,找到后path返回此so的绝对路径,以使后面的dlopen去动态打开此库。...这段代码位置在:linker.cc里面的 load_library函数: 于是我们看下is_greylisted,便是判断灰名单的方法: 这里更详细的不看,只需要关注我们>23之后,直接返回出错,禁止调用系统这些库

    2.1K60

    你真的会用JNI吗?这些小技巧99%的人都不知道

    性能陷阱   使用JNI的程序员面临的五大性能缺陷: 缓存方法ID,字段ID和类 触发数组拷贝 返回而不是传递参数 在本地代码Java代码之间选择了错误的边界 使用许多本地引用而不通知JVM 缓存方法...但是,对于JNI,本地代码必须通过一个或多个JNI调用返回到JVM,以获取所需的每个字段的值。这些调用会增加额外的开销,因为本机代码Java代码的转换比普通方法调用效率更低下。...Java代码调用本地代码本机调用Java代码的成本明显高于普通的Java方法调用。此外,转换也可能会影响JVM优化代码执行的能力。...JNI代码使用错误   JNI的五大使用错误: 错用 JNIEnv 不检查异常 不检查返回值 错误地使用数组方法 错误地使用全局引用 错用JNIEnv   子线程执行本地代码,尝试通过JNIEnv调用JNI...因此,本地代码返回将会立即抛出该异常! 不检查返回值   许多JNI方法都有一个返回值,指示调用是否成功。类似于不检查异常的常见代码错误,不检查返回值并且在假设调用成功的情况下继续进行,也很常见。

    1.1K20

    Android跨进程通信IPC之3——关于JNI的那些事

    C语言中调用Java的方法:可以让我们在C代码中找到Java代码class的方法,并且调用该方法 Java语言中调用C语言方法:同时也可以在Java代码中,将一个C语言的方法映射到Java的某个方法上...C语言代码 5、JNI接口函数和指针 平台相关代码通过调用JNI函数来访问Java虚拟机功能的。...当Java代码需要C/C++代码时,Dalvik虚拟机加载xxx.so库时,会先调用JNI_Onload(),此时会把Java对象的指针存储于C层JNI组件的全局环境中,在Java调用C层的Native...** Framework框架层代码 ** 是C/C++代码通过Framework进行系统调用调用底层的库和 Linux内核 ?...- Java )的纽带 2、JNI在Android中的作用 JNI可以调用本地代码库(即C/C++代码),并通过Dalvik虚拟机与应用层和应用框架层进行交互,Android 中的JNI主要位于应用层和应用框架层之间

    2.6K50

    【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives )

    JNI_OnLoad 函数原型 : Java 类中调用 System.loadLibrary(“native-lib”) 代码时 , 调用 JNI_OnLoad 方法 ; ① jni.h 中有该函数的声明...JavaVM 获取 JNIEnv ( GetEnv ) ---- 函数原型 : Java 虚拟机 ( JavaVM ) 中获取 JNI 运行环境 ( JNIEnv ) ; ① 参数说明 : void...返回 JNI_OK , 即 0 ; 动态注册失败 : 返回一个小于 0 的值 ; struct _JavaVM { //封装了 JNIInvokeInterface 结构体 , C 语言环境中调用该结构体中的方法...函数原型 : 通过该 RegisterNatives 方法注册 JNI 方法 ; 参数 : jclass clazz : 要注册方法所在的 Java 类 const JNINativeMethod* methods...JNI_Onload 方法 JNI_Onload 方法在 Java 层执行 System.loadLibrary("native-lib") 代码调用的方法 主要是执行一些

    94220

    「音视频直播技术」JNI编程常见问题

    你必须释放你获得的每个数组,此外,如果Get调用失败,您必须确保代码不会释放这个空指针。 您可以通过传递isCopy参数是否是NULL来确定数据是否被复制了。但这种方式基本没什么用。...异常 当异常待处理时,不能调用大多数JNI函数。您的代码应该会注意到异常(通过函数的返回值,ExceptionCheck或ExceptionOccurred)并返回,或者清除异常并处理它。...返回到本地代码管理后,异常将被注意到和处理。 本地代码可以通过调用ExceptionCheck或ExceptionOccurred“捕获”异常,并用ExceptionClear清除它。...jmethodIDs:在进行调用时,使用错误的jmethodID方法做JNI调用:不正确的返回类型,静态/非静态匹配,错误类型为'this'(非静态调用)或错误类(用于静态调用)。...类型安全:本机方法返回兼容的类型(例如:声明返​​回String的方法返回StringBuilder)。 UTF-8:将无效的修改后的UTF-8字节序列传递给JNI调用

    1.6K20
    领券