【问题标题】:JNI make file is not working. Multiple definitionsJNI make 文件不工作。多重定义
【发布时间】:2016-04-28 16:35:13
【问题描述】:

所以我正在尝试创建一个 jni 库,但是 make 文件给出了一个我不太理解的奇怪错误。

/tmp/ccPWlMuy.o: In function `Java_GameLogic_setMap':
GameLogic.c:(.text+0x0): multiple definition of `Java_GameLogic_setMap'
/tmp/ccajmgva.o:GameLogic.c:(.text+0x0): first defined here
/tmp/ccPWlMuy.o: In function `Java_GameLogic_hello':
GameLogic.c:(.text+0x1c): multiple definition of `Java_GameLogic_hello'
/tmp/ccajmgva.o:GameLogic.c:(.text+0x1c): first defined here
collect2: ld returned 1 exit status
make: *** [GameLogic.o] Error 1

make 文件是:

# Define a variable for classpath
CLASS_PATH = .

# Define a virtual path for .class in the bin directory
vpath %.class $(CLASS_PATH)

all : libGameLogic.so

# $@ matches the target, $< matches the first dependancy
libGameLogic.so : GameLogic.o
    gcc -W1 -shared -o $@ $<

# $@ matches the target, $< matches the first dependancy
GameLogic.o : GameLogic.c GameLogic.h
    gcc -fPIC -I /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.38.x86_64/include -I /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.38.x86_64/include/linux -shared GameLogic.c -o libGameLogic.so Map.c GameLogic.c

GameLogic.h: GameLogic.class PlayGame.class Bot.class
    javah -classpath $(CLASS_PATH) GameLogic

GameLogic.class: GameLogic.java
    javac *.java    

PlayGame.class: PlayGame.java
    javac *.java

Bot.class: Bot.java
    javac *.java

clean :
    rm GameLogic.o libGameLogic.so

要运行 make 文件,我在终端中输入 make ,这是它创建的错误。为此,我需要它以便 JNI 进行 c 调用,然后调用另一个 c 文件中的方法。

Java JNI GameLogic Map

按这个顺序。

任何建议都非常感谢非常感谢。


gcc -fPIC -I /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.38.x86_64/include -I /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.38.x86_64/include/linux -shared -o libGameLogic.so Map.c GameLogic.c
Map.h:7: warning: array ‘name’ assumed to have one element
Map.h:10: warning: array ‘map’ assumed to have one element
gcc -W1 -shared -o libGameLogic.so GameLogic.o
gcc: GameLogic.o: No such file or directory
gcc: no input files
make: *** [libGameLogic.so] Error 1
-bash-4.1$ 

【问题讨论】:

    标签: java c makefile java-native-interface


    【解决方案1】:

    您在这一行中编译和链接 GameLogic.c 两次:

    # $@ matches the target, $< matches the first dependancy
    GameLogic.o : GameLogic.c GameLogic.h
        gcc -fPIC -I /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.38.x86_64/include
        -I /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.38.x86_64/include/linux
        -shared GameLogic.c -o libGameLogic.so Map.c GameLogic.c
    

    【讨论】:

    • 现在我有一个新错误,我在问题中进行了更改
    • 好的。在不改变我的答案的情况下,看看同一行。您指定了-o libGameLogic.so。你应该改用GameLogic.o 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    相关资源
    最近更新 更多