我刚刚进入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。
谁能告诉我这里哪里错了?我想这是一个相对较小的细节,但我对此的理解目前是有限的。
答案 0 :(得分:0)
make
不了解classpath。
规则应为
TextGenerator.h : ../bin/com/test/mytestgame/TextGenerator.class
javah -classpath $(CLASS_PATH) $(<F)
但我真的不知道你将如何使用javah生成的包含文件。