gpt4 book ai didi

objective-c - 调试 Objective C JNI 代码

转载 作者:太空狗 更新时间:2023-10-30 03:50:37 26 4
gpt4 key购买 nike

情况是这样的:

我在 Eclipse 中打开了一个客户的 Java 项目。它使用由 Xcode Objective C 项目创建的 JNI 库。当我执行Java代码时,有什么好的方法可以从eclipse中调试C代码吗?显然 eclipse 的默认调试器无法进入 jni 库文件,我们失去了线程(这里的线程是指调查线程,而不是编程线程)。

感谢任何建议或输入,因为代码库足够大,遵循客户的代码将比其他选项快得多。

谢谢。

编辑:

需要注意的是,jni库之所以用Objective-C编写,是因为它是与Mac OSX集成的。它使用 Cocoa 框架与 Apple speech api 集成。

最佳答案

我不确定我是否已完全理解您的设置以及您是否需要从 eclipse 中完成此设置。无论如何,我有兴趣使用 JNI 和 Cocoa 库做一个小测试程序,什么都不做,只是为了尝试调试 obj-c/c 代码。

我成功地完成了这个设置并调试了代码。我将 IntelliJ 用于 Java,将 Xcode 用于 objc/c 部分,但在 eclipse 中执行 java 部分是一件轻而易举的事情。

所以你应该能够准确地设置我的项目结构并开始调试。从那里您应该能够将这些知识应用到您自己的更复杂的代码中。

我是这样开始的:

  • 通过选择 Cocoa Library 在 Xcode 中创建一个新项目。

Cocoa Library

  • 将项目命名为 libnative并将其设为动态类型。

Choose Options

  • 为您的新项目选择一个位置。我用 ~/Development/并跳过 Create local git...部分。

  • 这将创建一个名为 lib native.xcodeproj 的新项目在您选择的文件夹中。已自动创建两个文件:libnative.hlibnative.m .

  • 首先您必须更改项目设置。

    • Executable ExtensionPackaging部分必须从 dynlib 更改至 jnilib .
    • Framework Search PathsSearch Paths必须更新部分以指向 JNI 框架:/System/Library/Frameworks/JavaVM.framework/Frameworks/JavaNativeFoundation.framework/

enter image description here

  • 现在是时候添加一些代码了。请注意,使用此设置您将必须使用 <JavaVM/jni.h> .更新 libnative.m看起来像下面的代码:

//
// libnative.m
// libnative
//
// Created by maba on 2012-10-09.
// Copyright (c) 2012 maba. All rights reserved.
//

#import "libnative.h"
#include <JavaVM/jni.h>

@implementation libnative

@end

#ifdef __cplusplus
extern "C" {
#endif

#ifndef VEC_LEN
#define VEC_LEN(v) (sizeof(v)/sizeof(v[0]))
#endif/*VEC_LEN*/

static JavaVM *javaVM;

static void print();

static JNINativeMethod Main_methods[] =
{
{ "print", "()V", (void*)print },
};

static struct {
const char *class_name;
JNINativeMethod *methods;
int num_methods;
} native_methods[] = {
{ "com/stackoverflow/Main", Main_methods, VEC_LEN(Main_methods) },
};

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
JNIEnv *env = 0;
jclass cls = 0;
jint rs = 0;

if ((*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_4)) {
return JNI_ERR;
}

javaVM = jvm;

for (unsigned int i = 0; i < VEC_LEN(native_methods); i++) {
cls = (*env)->FindClass(env, native_methods[i].class_name);
if (cls == NULL) {
return JNI_ERR;
}
rs = (*env)->RegisterNatives(env, cls, native_methods[i].methods, native_methods[i].num_methods);
assert(rs == JNI_OK);
}

return JNI_VERSION_1_4;
}

static void print(JNIEnv *env, jclass cls) {
printf("Hello from C");
}

#ifdef __cplusplus
}
#endif
  • +B 构建代码。

  • 现在是创建 Java 代码的时候了。我只是在包 com.stackoverflow 中创建了一个名为 Main 的类.

com.stackoverflow.Main.java

package com.stackoverflow;

/**
* @author maba, 2012-10-09
*/
public class Main {

static native void print();

static {
System.out.println(System.getProperty("java.library.path"));
System.loadLibrary("native");
}

public static void main(String[] args) {
System.out.println("Loading native");
Main.print();
}
}
  • Main.print();之前的行设置断点.使用以下 JVM 选项启动调试器:

-Djava.library.path="/Users/maba/Library/Developer/Xcode/DerivedData/libnative-cquleqohzyhghnercyqdwpnznjdf/Build/Products/Debug/"

这一行有点长,而且是用户特定的。您将不得不自己寻找目录名称是什么,但除了生成的 libnative-cquleqohzyhghnercyqdwpnznjdf 之外,它们或多或少与我的相同。路径。

  • 程序应该正在运行并在断点处等待。是时候将 Xcode 调试器附加到正在运行的应用程序了。

  • 选择菜单 Product -> Attach to Process >并指向正在运行的java System 中的过程下拉的一部分。如果有几个 java那么它很可能是具有最高 PID 的进程,但并非总是如此。你将不得不尝试。

  • printf("Hello from C"); 行的c 代码中创建一个断点.

  • 返回 Java IDE 并从停止的地方继续执行。

  • 回到Xcode,看到它在断点处等待!

At Breakpoint


正如我之前所说,这是一种非常简单的 obj-c/JNI 方法,您的项目可能非常大,但通过这个小型测试项目,您至少可以了解它是如何工作的,然后继续您自己的项目设置。

关于objective-c - 调试 Objective C JNI 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12733614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com