Java调用第三方so实现Key的读写实例(Linux)

现在有一个第三方的动态链接库文件mwic.so,现在需要在java中调用此so文件里的函数,故先要生成一个可供java调用的 so(SOTest),具体步骤如下:

1.在java中新建一个空的类SOTest,实现以下代码(假设本次只需要调用SOTest中的run函数):
public class SOTest {   
      static {
          System.load("/home/user/Linux/SOTest.so");
      }
      public native static int run();
      public static void main(String args[]){
          SOTest test = new SOTest();
          System.out.println("kkkkk"+test.run());
      }
}

2.编译刚刚的类,得到.class文件,之后用javah生成头文件(如果不能直接javah SOTest,可以在终端可以先cd进jdk/bin目录下,之后把SOTest.class文件放在该目录下,直接运行javah SOTest)

3.使用c++的开发工具(我这里使用的是geany)新建一个cpp文件SOTest.cpp,并把刚刚得到的SOTest.h文件放到该目录下,并实现cpp里的代码
SOTest.h文件代码:
//注意要把“#include <jni.h>” 该成“#include "jni.h"”
#include "jni.h"
/* Header for class SOTest */

#ifndef _Included_SOTest
#define _Included_SOTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     SOTest
* Method:    run
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_SOTest_run
(JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

SOTest.cpp代码:
#include<dlfcn.h>
#include<stdio.h>
#include<stdlib.h>
#include "SOTest.h"
#include<string.h>
#include<iostream>

JNIEXPORT jint JNICALL Java_SOTest_run
(JNIEnv * env, jclass obj)
{
int devid=0;
int result;
bool tag=false;
std::cout<<"aaaaa";
int a=38400;
   std::cout<<"===============初始化,获得设备编号================/n";
   void* handle = dlopen("/home/user/Linux/mwic.so",RTLD_LAZY);
   typedef int (*auto_init)(char*,int);
   dlerror();
   auto_init AutoInit = (auto_init) dlsym(handle,"auto_init");
   const char *dlsym_error = dlerror();
   if(dlsym_error){
    //cerr<<"can't load symbol.."<<dlsym_error<<'/n';
    dlclose(handle);
    return -1;
   }
   devid=AutoInit("/home/user/Linux/star500x",38400);
   if(devid>0)
   {
    std::cout<<"success!/n";
   }else
   {
    std::cout<<"fail!/n";
   }
   std::cout<<"devid="<<devid<<"/n";
   std::cout<<"===============检查是否有卡================/n";
   typedef int (*get_status)(int,int *);
   dlerror();
   get_status GetStatus = (get_status) dlsym(handle,"get_status");
   dlsym_error = dlerror();
   if(dlsym_error){
    dlclose(handle);
    return -1;
   }
   int status;
   GetStatus(devid,&status);
   if(status==1)
   {
    std::cout<<"has card!/n";
   }else
   {
    std::cout<<"no card!/n";
   }
   std::cout<<"===============检查是否4442卡=================/n";
   typedef int (*chk_4442)(int);
   dlerror();
   chk_4442 Chk4442 = (chk_4442) dlsym(handle,"chk_4442");
   dlsym_error = dlerror();
   if(dlsym_error){
    //cerr<<"can't load symbol.."<<dlsym_error<<'/n';
    dlclose(handle);
    return -1;
   }
   result = Chk4442(devid);
   if(result==0)
   {
    std::cout<<"4442 card!/n";
   }else
   {
    std::cout<<"not 4442 catrd!/n";
   }
   std::cout<<"===============读出错计数器====================/n";
  
   typedef int (*rsct_4442)(int,int *);
   dlerror();
   rsct_4442 Rsct4442 = (rsct_4442) dlsym(handle,"rsct_4442");
   dlsym_error = dlerror();
   if(dlsym_error){
    dlclose(handle);
    return -1;
   }
   int counter;
   result=Rsct4442(devid,&counter);
   if(result>=0)
   {
    std::cout<<"count="<<counter<<"/n";
    if(counter>1)
    {
     tag=true;
    }
   }else
   {
    std::cout<<"error!/n";
   }
   if(tag==true)
   {
    std::cout<<"================校验密码=======================/n";
    typedef int (*csc_4442)(int,int,unsigned char *);
    dlerror();
    csc_4442 Csc4442 = (csc_4442) dlsym(handle,"csc_4442");
    dlsym_error = dlerror();
    if(dlsym_error){
     dlclose(handle);
     return -1;
    }
   
    unsigned char databuff[20];   
    unsigned char kk[20];
    memcpy(databuff,"/x11/x11/x11",3);
    memcpy(kk,"/xff/xff/xff",3);
    for(int k=0;k<3;k++)
    {
     std::cout<<kk[k]<<"/n";
    }   
    std::cout<<"databuff="<<databuff<<"/n";
    std::cout<<"kk="<<kk<<"/n";
    //unsigned char * data1="0xffffff";
    //data1 = (unsigned char*)(const_cast<char*>(""));
   
    result = Csc4442(devid,3,databuff);
    //t=&tt;
    if(result==0)
    {
     std::cout<<"password ok!/n";
    }else
    {
     std::cout<<"password wrong!/n";
    }
    std::cout<<"================写密码:111111==============/n";
    typedef int (*wsc_4442)(int,int,unsigned char *);
    dlerror();
    wsc_4442 Wsc4442 = (wsc_4442) dlsym(handle,"wsc_4442");
    dlsym_error = dlerror();
    if(dlsym_error){
     dlclose(handle);
     return -1;
    }
    unsigned char password[3];
    memcpy(password,"/x11/x11/x11",3);
    std::cout<<"set password to:"<<password<<"/n";
    result=Wsc4442(devid,3,password);
    if(result==0)
    {
     std::cout<<"set password success!/n";
     std::cout<<"password="<<password<<"/n";
    }else
    {
     std::cout<<"set password faild!/n";
    }
   
   
    std::cout<<"================读密码=====================/n";
    typedef int (*rsc_4442)(int,int,unsigned char *);
    dlerror();
    rsc_4442 Rsc4442 = (rsc_4442) dlsym(handle,"rsc_4442");
    dlsym_error = dlerror();
    if(dlsym_error){
     dlclose(handle);
     return -1;
    }
    //unsigned char * password=(unsigned char*)(const_cast<char*>("aaa"));
    //unsigned char * password;
    //unsigned char password[20];
   
    memcpy(password,"aaa",3);
    //password="aaaa";
    std::cout<<password<<"/n";
    result=Rsc4442(devid,3,password);
    if(result==0)
    {
     std::cout<<"read password success!/n";
     printf("password=%s/n",password);
    }else
    {
     std::cout<<"read password fiald!/n";
    }
    std::cout<<"================write data====================/n";
    typedef int (*swr_4442)(int,int,int,unsigned char *);
    dlerror();
    swr_4442 Swr4442 = (swr_4442) dlsym(handle,"swr_4442");
    dlsym_error = dlerror();
    if(dlsym_error){
     dlclose(handle);
     return -1;
    }
    unsigned char data[2000];
    memcpy(data,"123456",256-32);
    result=Swr4442(devid,32,256-32,data);
    if(result==0)
    {
     std::cout<<"write data success!/n";
     std::cout<<"data="<<data<<"/n";
    }else{
     std::cout<<"write data error!/n";
    }
    std::cout<<"================read data====================/n";
    typedef int (*srd_4442)(int,int,int,unsigned char *);
    dlerror();
    srd_4442 Srd4442 = (srd_4442) dlsym(handle,"srd_4442");
    dlsym_error = dlerror();
    if(dlsym_error){
     dlclose(handle);
     return -1;
    }
    unsigned char dataread[2000];
    result=Srd4442(devid,32,256-32,dataread);
    if(result==0)
    {
     printf("read data success!/n");
     printf("data=%s/n",dataread);
    }else
    {
     printf("read data error!/n");
    }
   

   }else
   {
    std::cout<<"can not go on!/n";
   }
   return 0;
}

4.把jdk/include目录下的jni.h和linux目录下的jni_md.h目录复制到SOTest.cpp同级目录下
   在geany中设置编译和生成参数
    编译:g++ -Wall -c "%f" -o "%e"
   生成:g++ -wl,--kill-at -shared -o "%e".so "%f"
   之后编译生成SOTest.so文件

5.把SOTest.so文件放到之前java代码中指定的地方("/home/user/Linux),运行程序,ok!

 

转: http://www.pczpg.com/a/2010/0421/6114.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的实例,演示如何使用 C 语言读写 Linux 下的配置文件。 假设我们有一个名为 "config.ini" 的配置文件,内容如下: ``` [database] host = localhost username = root password = password123 port = 3306 [server] ip = 127.0.0.1 port = 8080 ``` 我们要使用 C 语言读取这个配置文件,并将其中的值存储在内存中,以便我们在程序中使用。 首先,我们需要定义一个结构体来存储配置文件中的值: ```c typedef struct { char database_host[100]; char database_username[100]; char database_password[100]; int database_port; char server_ip[100]; int server_port; } Config; ``` 接下来,我们需要编写函数来读取配置文件。以下是一个示例函数: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> void read_config_file(Config* config) { FILE* fp; char line[100]; char section[100]; char key[100]; char value[100]; fp = fopen("config.ini", "r"); if (fp == NULL) { printf("Error: could not open config file.\n"); exit(1); } while (fgets(line, sizeof(line), fp)) { // remove newline character line[strcspn(line, "\n")] = 0; if (line[0] == '[') { // new section strcpy(section, line); } else { // key-value pair sscanf(line, "%[^=]=%s", key, value); if (strcmp(section, "[database]") == 0) { if (strcmp(key, "host") == 0) { strcpy(config->database_host, value); } else if (strcmp(key, "username") == 0) { strcpy(config->database_username, value); } else if (strcmp(key, "password") == 0) { strcpy(config->database_password, value); } else if (strcmp(key, "port") == 0) { config->database_port = atoi(value); } } else if (strcmp(section, "[server]") == 0) { if (strcmp(key, "ip") == 0) { strcpy(config->server_ip, value); } else if (strcmp(key, "port") == 0) { config->server_port = atoi(value); } } } } fclose(fp); } ``` 该函数使用 fopen() 函数打开配置文件,并使用 fgets() 函数逐行读取文件内容。对于每一行,它检查行首是否为 "[",以确定当前行是否为一个新的配置部分。如果是,它将当前部分存储在 section 变量中。否则,它使用 sscanf() 函数从当前行中提取键值对,并将其存储在相应的结构体成员中。 最后,我们可以使用以下代码将配置文件的值读入内存中: ```c int main() { Config config; read_config_file(&config); printf("database host: %s\n", config.database_host); printf("database username: %s\n", config.database_username); printf("database password: %s\n", config.database_password); printf("database port: %d\n", config.database_port); printf("server ip: %s\n", config.server_ip); printf("server port: %d\n", config.server_port); return 0; } ``` 该代码调用 read_config_file() 函数,并将 Config 结构体的指针传递给它。然后,它打印每个配置值的值,以确保它们已正确读入内存中。 这就是一个简单的 Linux C 配置文件读写实例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值