JNI:没有规则来制定目标问题

时间:2013-12-08 17:12:26

标签: eclipse ubuntu java-native-interface libgdx

我刚刚进入Eclipse中的JNI并且已经在Ubuntu中跟踪了this JNI教程的Eclipse部分。我设法通过使用以下文件夹结构来实现这一点:

.
└── HelloJNI
    ├── bin
    │   └── HelloJNI.class
    ├── jni
    │   ├── HelloJNI.c
    │   ├── HelloJNI.h
    │   ├── HelloJNI.o
    │   ├── libhello.so
    │   └── makefile
    └── src
        ├── HelloJNI.class
        └── HelloJNI.java

这个项目中的makefile如下所示:

# Define a variable for classpath
CLASS_PATH = ../bin

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

all : libhello.so

# $@ matches the target, $< matches the first dependancy
libhello.so : HelloJNI.o
    gcc -shared -fpic -o $@ $<

# $@ matches the target, $< matches the first dependancy
HelloJNI.o : HelloJNI.c HelloJNI.h
    gcc -fpic -I"/usr/lib/jvm/java-6-openjdk-amd64/include" -I"/usr/lib/jvm/java-6-openjdk-amd64/include/linux" -c $< -o $@

# $* matches the target filename without the extension
HelloJNI.h : HelloJNI.class
javah -classpath $(CLASS_PATH) $*

clean :
    rm HelloJNI.h HelloJNI.o libhello.so

现在我想在Android的Libgdx项目中复制这个。我在这里的核心项目的文件夹结构如下所示:

.
├── bin
│   ├── com
│   │   └── test
│   │       └── mytestgame
│   │           ├── TestGame.class
│   │           └── TextGenerator.class
│   └── TestGame.gwt.xml
├── jni
│   └── makefile
├── libs
│   ├── gdx.jar
│   └── gdx-sources.jar
└── src
    ├── com
    │   └── test
    │       └── mytestgame
    │           ├── TestGame.java
    │           └── TextGenerator.java
    └── TestGame.gwt.xml

我在这个项目中的makefile被定义为:

# Define a variable for classpath
CLASS_PATH = ../bin

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

all : libTextGenerator.so

# $@ matches the target, $< matches the first dependancy
libTextGenerator.so : TextGenerator.o
        gcc -shared -fpic -o $@ $<

# $@ matches the target, $< matches the first dependancy
TextGenerator.o : TextGenerator.cpp TextGenerator.h
        gcc -fpic -I"/usr/lib/jvm/java-6-openjdk-amd64/include" -I"/usr/lib/jvm/java-6-    openjdk-amd64/include/linux" -c $< -o $@

# $* matches the target filename without the extension
TextGenerator.h : TextGenerator.class
        javah -classpath $(CLASS_PATH) $*

clean :
        rm TextGenerator.h TextGenerator.o libTextGenerator.so

TextGenerator类只能作为一个产生半随机文本的小类来测试我可以在Java中使用C ++中的String。这个类看起来像这样:

package com.test.mytestgame;

public class TextGenerator {
    static{
            System.load("TextGenerator"); // Filename libTextGenerator.so
    }

    /**Empty constructor.*/
    public TextGenerator(){
    }

    /**Returns a semi-not-so-random-text*/
    public native String generateText();    
}

现在的问题是,当我尝试运行makefile的TextGenerator.h部分时,我收到以下错误:

**** Build of configuration Default for project my-fluids-game ****

make TextGenerator.h 
make: *** No rule to make target `TextGenerator.class', needed by `TextGenerator.h'.  Stop.

**** Build Finished ****

我尝试将CLASS_PATH变量更改为../bin/com/test/mytestgame,但这只会产生其他错误。据我所知,使用-classpath标志时可以使用../bin。

谁能告诉我这里哪里错了?我想这是一个相对较小的细节,但我对此的理解目前是有限的。

1 个答案:

答案 0 :(得分:0)

make不了解classpath。

规则应为

TextGenerator.h : ../bin/com/test/mytestgame/TextGenerator.class
    javah -classpath $(CLASS_PATH) $(<F)

但我真的不知道你将如何使用javah生成的包含文件。