我不确定我是否完全理解您的设置,以及您是否需要从 Eclipse 中完成此操作。无论如何,我对使用 JNI 和 Cocoa 库做一个小测试程序很感兴趣,只是为了尝试调试 obj-c/c 代码。
我成功地完成了这个设置并调试了代码。我将 IntelliJ 用于 Java,将 Xcode 用于 objc/c 部分,但在 eclipse 中执行 java 部分是轻而易举的事。
所以你应该能够准确地设置我的项目结构并开始调试。从那里您应该能够将这些知识应用到您自己的更复杂的代码中。
这就是我开始的方式:
- 通过选择 Cocoa Library 在 Xcode 中创建一个新项目。
- 现在是时候添加一些代码了。请注意,使用此设置您将不得不使用
<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
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 的进程,但并非总是如此。你得试试。
在c代码中创建断点就行了printf("Hello from C");
。
返回 Java IDE 并从停止的地方继续执行。
回到 Xcode,看看它在断点处等待!
正如我之前所说,这是 obj-c/JNI 的一种非常简单的方法,您的项目可能非常大,但是通过这个小型测试项目,您至少可以看到它是如何工作的,然后继续您自己的项目设置。