我刚开始学习jni,并决定做一个你好的世界。我创建了一个helloworld java文件,其代码是
public class HelloWorld {
public native void displayHelloWorld();
static{
System.loadLibrary("hello");
}
public static void main(String[] args){
new HelloWorld().displayHelloWorld();
}
}
我编译了它,得到了下面的头文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
然后创建一个代码为的c文件
#include<jni.h>
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj){
printf("Hello World n");
return;
}
并对其进行编译以创建helloworld.o文件
现在,当我尝试使用命令创建.dll文件时
gcc -shared -o hello.dll HelloWorld.o -Wl,--add-stdcall-alias
我收到这个错误
At line:1 char:42
+ gcc -shared -o hello.dll HelloWorld.o -Wl,--add-stdcall-alias
+ ~
Missing argument in parameter list.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingArgument
我错过了什么?
问题是,在PowerShell中,逗号具有逗号运算符的特殊含义,而不像在Bash中,在这种上下文中,它没有任何特殊含义。解析命令时,-Wl
被视为参数名称,,
被解释为形成一个数组(参数列表(作为其参数。如链接文档中所示,除非在表达式模式中,否则,
必须是二进制运算符,而对于命令调用,则使用参数模式。但是这个逗号没有剩余的参数,因此Missing argument in parameter list
错误。
要解决此问题,您可以更改命令,通过使用其中一种类型的字符串将-Wl,--add-stdcall-alias
设置为带引号的字符串,使PowerShell停止以特殊方式对,
进行积分。对于我们的简单情况,任何字符串类型都可以,例如,对于单引号字符串,我们有:
gcc -shared -o hello.dll HelloWorld.o '-Wl,--add-stdcall-alias'
另一个选项是使用停止解析令牌--%
:
gcc --% -shared -o hello.dll HelloWorld.o -Wl,--add-stdcall-alias