当前位置: 首页 > 知识库问答 >
问题:

无法获得最简单的JNI eample以在Windows 10上运行

朱慈
2023-03-14

对于我正在做的一个项目,我很快就必须使用Java本机接口。我试图通过阅读IBM DeveloperWorks站点上的这篇教程来开始使用它。

基本上,它告诉我写这个类:

public class Sample1 {
  public native int intMethod( int n );
  public native boolean booleanMethod( boolean bool );
  public native String stringMethod( String text );
  public native int intArrayMethod( int[] intArray );

  public static void main( String[] args ){
    try{
      System.loadLibrary( "Sample132" );
    } catch( UnsatisfiedLinkError e ){
        System.out.println( "Linking failed with message\n" + e.getMessage() );
    }

    Sample1 sample = new Sample1();
    int square = 0, sum = 0;
    boolean bool = false;
    String text = "";

    try{
      square = sample.intMethod( 5 );
      bool   = sample.booleanMethod( true );
      text   = sample.stringMethod( "JAVA" );
      sum    = 
        sample.intArrayMethod(
          new int[]{ 1, 1, 2, 3, 5, 8, 13 } );
    } catch( UnsatisfiedLinkError e ){
      System.out.println( "Calling native method failed with\n" + e.getMessage() );
      System.exit( 1 );
    }

    System.out.println( "intMethod: " + square );
    System.out.println( "booleanMethod: " + bool );
    System.out.println( "stringMethod: " + text );
    System.out.println( "intArrayMethod: " + sum );
  }
}
#include "Sample1.h"

#include <string.h>

extern "C" {
JNIEXPORT jint JNICALL Java_Sample1_intMethod
  ( JNIEnv * env, 
    jobject obj, 
    jint num ){
      return( num * num );
    }

JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod
  ( JNIEnv * env, 
    jobject obj, 
    jboolean boolean ){
    return( ! boolean );
  }

JNIEXPORT jstring JNICALL Java_Sample1_stringMethod
  ( JNIEnv * env, 
    jobject obj,
    jstring string ){
    const char * str = env->GetStringUTFChars( string, 0 );
    char cap[ 128 ];
    strcpy( cap, str );
    env->ReleaseStringUTFChars( string, 0 );
    return( env->NewStringUTF( strupr( cap ) ) );
  }

JNIEXPORT jint JNICALL Java_Sample1_intArrayMethod
  ( JNIEnv * env,
    jobject obj,
    jintArray array ){
    int i, sum = 0;
    jsize len = env->GetArrayLength( array );
    jint * body = env->GetIntArrayElements( array, 0 );
    for( i=0; i < len; i++ ){
      sum += body[ i ];
    }
    env->ReleaseIntArrayElements(array, body, 0);
    return( sum );
  }
}
Dump of file Sample132.dll

File Type: DLL

  Section contains the following exports for Sample132.dll

    00000000 characteristics
    5B4F79B4 time date stamp Wed Jul 18 19:32:36 2018
        0.00 version
           1 ordinal base
           4 number of functions
           4 number of names

    ordinal hint RVA      name

          1    0 000012DE Java_Sample1_booleanMethod@12
          2    1 00001368 Java_Sample1_intArrayMethod@12
          3    2 000012D0 Java_Sample1_intMethod@12
          4    3 000012F5 Java_Sample1_stringMethod@12

  Summary

        1000 .CRT
        1000 .bss
        1000 .data
        1000 .debug_abbrev
        1000 .debug_aranges
        2000 .debug_info
        1000 .debug_line
        1000 .edata
        1000 .eh_frame
        1000 .idata
        1000 .rdata
        1000 .reloc
        1000 .text
        1000 .tls

谢谢你,约书亚

编辑:这是一个仍然无法编译的C++文件

#include "Sample1.h"

#include <string.h>

JNIEXPORT jint JNICALL Java_Sample1_intMethod
  ( JNIEnv * env, 
    jobject obj, 
    jint num ){
      return( num * num );
    }

JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod
  ( JNIEnv * env, 
    jobject obj, 
    jboolean boolean ){
    return( ! boolean );
  }

JNIEXPORT jstring JNICALL Java_Sample1_stringMethod
  ( JNIEnv * env, 
    jobject obj,
    jstring string ){
    const char * str = env->GetStringUTFChars( string, 0 );
    char cap[ 128 ];
    strcpy( cap, str );
    env->ReleaseStringUTFChars( string, 0 );
    return( env->NewStringUTF( strupr( cap ) ) );
  }

JNIEXPORT jint JNICALL Java_Sample1_intArrayMethod
  ( JNIEnv * env,
    jobject obj,
    jintArray array ){
    int i, sum = 0;
    jsize len = env->GetArrayLength( array );
    jint * body = env->GetIntArrayElements( array, 0 );
    for( i=0; i < len; i++ ){
      sum += body[ i ];
    }
    env->ReleaseIntArrayElements(array, body, 0);
    return( sum );
  }

void main(){}

共有1个答案

龚奇逸
2023-03-14

好吧,我解决了我的问题。问题是我构建DLL的方式。

首先,您应该将kill-at选项传递给MinGW链接器(ld)。当您不传递这个选项时,您的符号仍然会以一种微妙的方式被破坏,尽管有外部的“C”声明:在函数名的末尾,编译器会附加@ 。这看起来是一个小细节,但你不想这样。Java(或者至少是标准的Oracle JVM)并不期望使用这个后缀!

其次,G++实际上允许您定义_jni_implementation。这个内置标识符将向编译器发出信号,表示它将要构建的共享库将用于JNI,并相应地配置它自己。

我希望这对将来的某个人也有帮助。非常感谢你的帮助,阿拉!:)

 类似资料:
  • 我有一些使用下面某个模块的网页抓取Python代码 硒 bs4 MySQLdb 调度器 在网上或云上运行代码的最简单方法或平台是什么?

  • 我在Mac上安装了pycharm(Python3.6)+selenium(3.8)。 正在尝试运行: 我得到错误:

  • 问题内容: 我已经编写了一个基本的node.js应用程序,并且设法将其部署在Heroku上没有任何问题。我创建了 package.json 和 Procfile ,但是从日志中看到没有正在运行的进程,因此无法获得任何响应。可能是什么问题呢? PS: 我不想使用 Express 框架 我的代码: 我的package.json: 日志: 问题答案: 您已缩放heroku应用程序了吗? 这是必需的步骤。

  • 问题内容: 如何使用以下代码制作jsfiddle: 我无法正常工作的尝试:http : //jsfiddle.net/zhon/3DHjg/没有显示任何内容,并且有错误。 问题答案: @ pkozlowski.opensource有一篇不错的博客文章,介绍如何使用jsFiddle编写AngularJS示例程序。

  • 我已经启动并运行了AngularJS和web.api WAAD身份验证。对于客户端,我使用了很棒的库adal.js。对于后端,我使用Microsoft.OWIN.Security.OAuth。这部分进行得相当顺利。 现在我要实现基于角色的授权(将映射到WAAD组)。组不包括在身份验证令牌中,所以我必须向Azure Graph API请求它们。我看到了各种实现方法,例如使用自定义声明提供程序、向pr

  • 我知道甚至这个问题已经被提出了几次,但没有找到解决这个问题的方法。我使用的编译命令:。我使用的运行命令: 错误: