在Java类中使用启用JNI的Lib

问题描述

我已经使用JNI编译了本机DLL的包装。 现在,我想在我的应用程序中使用该库,但是我不知道如何访问该库的功能。

我使用:

public class JNIViie {

    private JFrame frame;
    
    static {
        System.loadLibrary("MySDK");
    }
    
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        
        String mkey = "1234";
        
        String out = stringFromJNI(mkey);
        
        EventQueue.invokeLater(new Runnable() {
            public void run() {

                
                try {
                    JNIViie window = new JNIViie();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public JNIViie() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100,100,450,300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    public native String stringFromJNI(String mkey);
    

}

我用CMake创建的JNI库是: cpp文件

//
// Created by ingo on 31.03.20.
//

#include "MySDK.h"
#include <tchar.h>

#include <jni.h>
#include <string>

MySDK::MySDK (const TCHAR * licensekey){

    int32 res = ::Initialize(licensekey,BS_ASPI_INTERNAL,BS_TRUE);
    //int32 res = ::CheckLicenseKey(licensekey);


}

std::string MySDK::driveList() {
    int32 res =  ::RescanDevices();


    std::string mydrives;

    TCHAR chListDevices[26][50];
    int32 nUsed = 0;
    res = ::GetDevices(chListDevices,&nUsed,false);

    if (BS_SDK_ERROR_NO == res) {
        for (int i = 0; i < nUsed; i++) {
            mydrives.append(chListDevices[i]);
            mydrives.append(" | ");
        }
    }

    return mydrives;
}

MySDK::~MySDK() {

}

static MySDK *example = NULL;

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_mysdk_MainActivity_stringFromJNI(
        JNIEnv* env,jobject thiz,jstring lkey){
    const TCHAR *licenceKey = env->GetStringUTFChars(lkey,JNI_FALSE);
    //const TCHAR *licenceKey = "1234";
    example = new MySDK(licenceKey);
    env->ReleaseStringUTFChars(lkey,licenceKey);

    std::string hello = "Hello from ingo";
    return env->NewStringUTF(hello.c_str());
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_mysdk_MainActivity_drivelist(
        JNIEnv* env,jobject thiz
        ){

    std::string drives= example->driveList();

    return env->NewStringUTF(drives.c_str());
}

头文件

//
// Created by ingo on 31.03.20.
//

#ifndef MYSDK_MYSDK_H
#define MYSDK_MYSDK_H
#include <string>

class MySDK {
public:

    MySDK(const TCHAR * licensekey);
    ~MySDK();

    std::string driveList();
};


#endif //MYSDK_MYSDK_H

始终未知stringFromJNI(mkey);。我确定我错过了要添加的内容,但是我想我需要帮助才能知道我错过了什么。

我的包裹看起来像这样(图片):

Package View

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...