在windows下 如何使用java jni调用so文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在windows下 如何使用java jni调用so文件相关的知识,希望对你有一定的参考价值。

百度了一下,都是说在windws下调用dell文件的。

参考技术A so文件。。。。。http://zhidao.baidu.com/link?url=5_gVhwciQDttEyKc449-c_jLJqQ_8cUirCQBHurCAqF2GROZ54zXIEQzh89_t9lzKuFe1LfwN7MmvYjCQt1wsF7WGJXSxzf0b1TDAEYVDaq

如何在 JNI 中使用自定义类类型参数调用 Java 函数

【中文标题】如何在 JNI 中使用自定义类类型参数调用 Java 函数【英文标题】:How to call a Java function in JNI with custom class type argument 【发布时间】:2021-07-05 06:51:23 【问题描述】:

我正在尝试使用自定义类类型参数从 C++ 调用 Java 函数。问题是从 C++ 调用 Java 函数时会得到垃圾值(代码如下所示)。如果我使用任何其他数据类型(String、float、int)的参数,则相同的函数printClassVar 可以正常工作。

这是Java代码

/*Filename: CallbacksExample.java*/

public class CallbacksExample 
    static 
        System.loadLibrary("myjni");
    
    
    public static void main(String[] args) 
        new CallbacksExample().callback();
    

    public native void callback(); 

    public static void printClassVar(Person person)
    
        System.out.println("Got callback from C++: " + person.age );
    

/*Filename: Person.java*/

public class Person 

    public int age;

    public Person() 
        this.age = 20;
    

    public int value() 
        return age;
    

这是 JNI 代码

/*Filename: CallbacksExample.cpp*/

#include <iostream>
#include <jni.h>
#include "CallbacksExample.h"

using namespace std;

class Person

    int age;

public:
    Person()
    
        age = 5;
    

    int value()
    
        return age;
    
;

JNIEXPORT void JNICALL
Java_CallbacksExample_callback(JNIEnv *env, jobject jthis)

    jclass thisClass = env->GetObjectClass(jthis);

    Person _per;
    Person* class_ptr = &_per;

    std::cout << class_ptr->value() << std::endl;     

    jmethodID printClassVar = env->GetStaticMethodID(thisClass, "printClassVar", "(LPerson;)V");
    if (NULL == printClassVar)
        return;

    env->CallVoidMethod(jthis, printClassVar, &class_ptr);

以上代码返回

从 C++ 获得回调:1679598160(或任何垃圾签名的 int 值

【问题讨论】:

JNI 不是这样工作的。它不会自动将 C++ 对象转换为 Java 对象。您必须构造一个新的 Java Person(使用 FindClassNewObject),然后在其上设置各种字段(或添加一个获取字段初始值的构造函数)。 【参考方案1】:

这是在 C++ 中调用具有类类型参数的 Java 函数的正确方法

/*Filename: CallbacksExample.java*/

public class CallbacksExample 
    static 
        System.loadLibrary("myjni");
    
    
    public static void main(String[] args) 
        new CallbacksExample().callback();
    

    public native void callback(); 

    public static void printClassVar(Person person)
    
        System.out.println("Got callback from C++: " + person.age );
    

/*Filename: Person.java*/

public class Person 

    public int age;

    public Person() 
        this.age = 20;
    

    public void set(int x)
    
        age = x;
    

    public int value() 
        return age;
    


/*Filename: CallbacksExample.cpp*/

#include <iostream>
#include <jni.h>
#include "CallbacksExample.h"

JNIEXPORT void JNICALL
Java_CallbacksExample_callback(JNIEnv *env, jobject jthis)

    jclass thisClass = env->GetObjectClass(jthis);

    jclass personClass = env->FindClass("Person");

    jmethodID class_constructor = env->GetMethodID(personClass, "<init>", "()V"); // no parameters
    jobject personObj = env->NewObject(personClass, class_constructor);

    auto personMethod = env->GetMethodID(personClass, "set", "(I)V");
    env->CallVoidMethod(personObj, personMethod, 15);

    jmethodID printClassVar = env->GetStaticMethodID(thisClass, "printClassVar", "(LPerson;)V");
    if (NULL == printClassVar)
        return;

    env->CallVoidMethod(jthis, printClassVar, personObj);

【讨论】:

以上是关于在windows下 如何使用java jni调用so文件的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 里面如何 使用jni 给个例子 加 解释。谢谢

DDS Java 示例引发大量警告“在未检查异常的情况下进行 JNI 调用”

jni调用崩溃的情况下如何在linux上查找失败的原因?

Java中怎么调用Windows的API

JAVA中如何调用API函数?

Windows下JNI的使用教程