我有一个简单的java类("MainX"),我使用shell脚本和eclipse编译.当我调用env-> FindClass("MainX")函数时,从脚本生成的MainX.class文件返回null,而从eclipse生成的MainX.class文件返回该类,然后执行runMainX函数.
生成的MainX.class文件与JNI C++可执行文件位于同一文件夹中.
MainX.java
public class MainX {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(new MainX().runMainX());
}
public String runMainX(){
return ("0.789");
}
}
Run Code Online (Sandbox Code Playgroud)
JNIBinding.cpp
#define USER_CLASSPATH "."
....
....
JNIEnv* createVM (JavaVM **jvm)
{
JNIEnv *env; /* pointer to native method interface */
JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */
JavaVMOption* options = new JavaVMOption[1]; //holds various JVM optional settings
options[0].optionString = const_cast<char*>("-Djava.class.path="USER_CLASSPATH);
vm_args.version = JNI_VERSION_1_6; //version of Java platform
vm_args.nOptions …Run Code Online (Sandbox Code Playgroud) 我从这里购买了绝对初学者和温度转换器应用程序的Android应用程序的hello world应用程序 两者在模拟器上运行正常,但当我尝试在Samsung Note 2上运行它时,LogCat上出现错误
02-08 07:22:18.665: E/dalvikvm(30944): JNI ERROR (app bug): accessed stale local reference 0xbc00021 (index 8 in a table of size 8)
02-08 07:22:18.665: E/dalvikvm(30944): VM aborting
02-08 07:22:18.665: A/libc(30944): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 30944 (oid.temperature)
Run Code Online (Sandbox Code Playgroud)
两个应用程序都使用标题打开显示布局,但在布局中不显示任何其他视图
样品运行良好
设备:备注2 Samsung-gt_n7100
IDE:Eclipse版本3.8
操作系统:64位Windows 7
我是JNI的新手,这是我第一个尝试从C++调用Java代码的程序.我正在使用Qt 5.2,我正在编写一个Android应用程序.
我无法找到我的java类并将其加载到我的C++程序中.我已经在堆栈溢出和其他地方阅读了很多帖子,这似乎是一个常见的问题,但我还没能解决我的问题..
我也不确定Java VM是否已正确设置,因为QAndroidJniEnvironment上的Qt文档很少.
我正在寻找一个如何找到我的java类的解决方案.我也很欣赏代码其他部分的一般反馈(我假设可能会有更多错误).
错误消息:
Starting remote process.D/dalvikvm(24911): GC_CONCURRENT freed 384K, 5% free 9180K/9596K, paused 1ms+2ms, total 15ms
D/dalvikvm(24911): Trying to load lib /data/data/org.qtproject.example.AndroidTest/lib/libgnustl_shared.so 0x428b2360
D/dalvikvm(24911): Added shared lib /data/data/org.qtproject.example.AndroidTest/lib/libgnustl_shared.so 0x428b2360
D/dalvikvm(24911): No JNI_OnLoad found in /data/data/org.qtproject.example.AndroidTest/lib/libgnustl_shared.so 0x428b2360, skipping init
D/dalvikvm(24911): Trying to load lib /data/data/org.qtproject.example.AndroidTest/lib/libQt5Core.so 0x428b2360
D/dalvikvm(24911): Added shared lib /data/data/org.qtproject.example.AndroidTest/lib/libQt5Core.so 0x428b2360
D/dalvikvm(24911): Trying to load lib /data/data/org.qtproject.example.AndroidTest/lib/libQt5Network.so 0x428b2360
D/dalvikvm(24911): Added shared lib /data/data/org.qtproject.example.AndroidTest/lib/libQt5Network.so 0x428b2360
I/Qt (24911): Network start
D/dalvikvm(24911): Trying to load lib /data/data/org.qtproject.example.AndroidTest/lib/libQt5Qml.so 0x428b2360
D/dalvikvm(24911): …Run Code Online (Sandbox Code Playgroud) 我在头文件中得到了c ++结构,
struct StatusLine
{
static jclass Class; // Lorg/apache/http/StatusLine;
static jmethodID GetStatusCode; // ()I
};
struct ByteArrayOutputStream
{
static jclass Class; // Ljava/io/ByteArrayOutputStream;
static jmethodID Constructor; // ()V
static jmethodID Close; // ()V
static jmethodID ToByteArray; // ()[B
};
struct HttpEntity
{
static jclass Class; // Lorg/apache/http/HttpEntity;
static jmethodID WriteTo; // (Ljava/io/OutputStream;)V
static jmethodID GetContent; // ()Ljava/io/InputStream;
};
Run Code Online (Sandbox Code Playgroud)
和cpp文件是
#define JAVA_STATUS_LINE_CLASS "org/apache/http/StatusLine"
#define JAVA_HTTP_ENTITY_CLASS "org/apache/http/HttpEntity"
#define JAVA_BYTE_ARRAY_OUTPUT_STREAM_CLASS "java/io/ByteArrayOutputStream"
jclass StatusLine::Class = 0;
jmethodID StatusLine::GetStatusCode = 0;
jclass ByteArrayOutputStream::Class = …Run Code Online (Sandbox Code Playgroud)