对于我正在做的一个项目,我很快就必须使用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(){}
好吧,我解决了我的问题。问题是我构建DLL的方式。
首先,您应该将kill-at选项传递给MinGW链接器(ld)。当您不传递这个选项时,您的符号仍然会以一种微妙的方式被破坏,尽管有外部的“C”声明:在函数名的末尾,编译器会附加@
其次,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
我知道甚至这个问题已经被提出了几次,但没有找到解决这个问题的方法。我使用的编译命令:。我使用的运行命令: 错误: