【问题标题】:JNI header missing in Objective-CObjective-C 中缺少 JNI 标头
【发布时间】:2020-04-16 16:41:44
【问题描述】:

我的项目中有一个file.c,其中有#include <jni.h> 头文件。在项目或macOS中包含这个头文件的过程是什么?

【问题讨论】:

  • this 回答你的问题了吗?
  • @AlekseyPotapov 我在系统文件夹中找到了头文件的位置。但我正在努力将该头文件与 xCode 连接
  • 在 Xcode 打开 Build Settings 并检查 header search paths,应该有你的库的路径。 This might回答你的问题
  • @AlekseyPotapov 你的建议帮助我解决了这个问题
  • 这能回答你的问题吗? Adding system header search path to Xcode

标签: objective-c macos java-native-interface


【解决方案1】:

假设您有以下代码

#include "jni.h"
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        JNIEnv *env;
        JavaVM *jvm;
        JavaVMInitArgs vm_args;
        JavaVMOption options[3];

        options[0].optionString = "-Djava.class.path=_HERE_GOES_LOCATION_OF_JNICOOKBOK_/jnicookbook/recipeNo051/target";

        vm_args.options = options;
        vm_args.ignoreUnrecognized = 0;
        vm_args.version = JNI_VERSION_1_8;
        vm_args.nOptions = 1;           

        int status = JNI_CreateJavaVM (&jvm, (void **) &env, &vm_args);
        if (status < 0 || !env) {
          printf ("Error - JVM creation failed\n");
          return 1;
        }

        jclass cls_Main = (*env)->FindClass (env, "recipeNo051/Main");

        jmethodID method_displayMessage = (*env)->GetStaticMethodID (env, cls_Main, "displayMessage", "()V");
        (*env)->CallStaticVoidMethod(env, cls_Main, method_displayMessage);

        (*jvm)->DestroyJavaVM( jvm );
    }

    return 0;
}

为了运行它,你需要

  • libjvm.dylib 的位置
  • 标头位置
  • main.m 调用的已编译 Java 类的位置

让我们从库和头文件开始。您必须确保搜索包含以下路径(注意我使用的是 jdk-11.0.4):

/Library/Java/JavaVirtualMachines/jdk-11.0.4.jdk/Contents/Home/include
/Library/Java/JavaVirtualMachines/jdk-11.0.4.jdk/Contents/Home/include/darwin/

您必须确保将以下路径添加到 Library Search PathRunpath Search Paths

/Library/Java/JavaVirtualMachines/jdk-11.0.4.jdk/Contents/Home/lib/server

你应该有这样的设置:

确保您将代码与libjvm.dylib 链接。将其添加到Build Phases

您可以通过选择Add Other...来指定它的位置

运行您的代码,但是!确保在调用方法JNI_CreateJavaVM 之前忽略SIGSEGV。您可以在lldb 控制台中忽略它

(lldb) process handle --pass true --stop false SIGSEGV

继续后,您可以看到您的JVM 实例从recipeNo051 调用类。

类的源代码:recipeNo051/Main可以在这里找到:https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo051

更新

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2012-06-06
    相关资源
    最近更新 更多