首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JNI没有识别jni原语类型,例如string

JNI没有识别jni原语类型,例如string
EN

Stack Overflow用户
提问于 2016-04-25 17:21:57
回答 2查看 108关注 0票数 2

我为C头创建了一个make文件,它工作得很好,但是我说JNICALLJNIEnv存在语法错误,但是我发现这是因为头文件中的类型。

故障图像

图片中的代码如下:

代码语言:javascript
复制
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class GameLogic */

#ifndef _Included_GameLogic
#define _Included_GameLogic
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     GameLogic
 * Method:    hello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_GameLogic_hello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

当我试图运行该项目时,我会得到以下错误:

代码语言:javascript
复制
Exception in thread "main" java.lang.UnsatisfiedLinkError: GameLogic.hello()Ljava/lang/String;
    at GameLogic.hello(Native Method)
    at GameLogic.<init>(GameLogic.java:7)
    at GameLogic.main(GameLogic.java:11)

C文件:

代码语言:javascript
复制
#import <jni.h>
#import <stdio.h>
#include "GameLogic.h"

JNIEXPORT jstring JNICALL Java_GameLogic_hello (JNIEnv * env, jobject thisObj) {
    return (*env)->NewStringUTF(env, "Sup");
}

通用制作文件:

代码语言:javascript
复制
# Define a variable for classpath
CLASS_PATH = ../

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

all : libGameLogic.jnilib

# $@ matches the target, $< matches the first dependancy
libGameLogic.jnilib : GameLogic.o
    gcc -dynamiclib -framework JavaVM -o $@ $<

# $@ matches the target, $< matches the first dependancy
GameLogic.o : GameLogic.c GameLogic.h
    gcc -I/System/Library/Frameworks/JavaVM.framework/Headers -framework JavaVM -c $< -o $@

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

clean :
    rm GameLogic.h GameLogic.o libGameLogic.jnilib

GameLogic:

代码语言:javascript
复制
public class GameLogic {

    public native String hello ();

    public GameLogic  () {
        System.out.println(hello());
    }

    public static void main (String[] args) {
        new GameLogic ();
    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-25 17:49:40

尝试使用:编译

代码语言:javascript
复制
gcc -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin/" -dynamiclib -o libGameLogic.jnilib GameLogic.c

然后在您的类文件中添加:

代码语言:javascript
复制
static {
    // GameLogic.dll (Windows) or libGameLogic.so (Unixes) or libGameLogic.jnilib (Mac)
    System.loadLibrary("GameLogic");
}

,最后将类作为下一个启动(假设文件.class和lib libGameLogic.jnilib位于当前目录中)

代码语言:javascript
复制
java -Djava.library.path=. GameLogic
票数 1
EN

Stack Overflow用户

发布于 2016-04-25 18:22:08

所以我知道问题出在哪里了。我忘了说图书馆在哪里。

代码语言:javascript
复制
static {
        System.load(System.getProperty("user.dir")+"/jni/libhello.jnilib");
    }

然后,eclipse正在抛出的所有错误实际上并不存在,只能被忽略。谢谢大家。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36847103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档