tha*_*guy 5 eclipse debugging java-native-interface xcode objective-c
情况如下:
我在eclipse中打开了一个客户端的java项目.它使用由Xcode Objective C项目创建的JNI库.在执行Java代码时,有没有什么好方法可以从eclipse调试C代码?显然,eclipse的默认调试器无法进入jni库文件而我们丢失了线程(线程意味着调查线程在这里,而不是编程线程).
任何建议或输入都是值得赞赏的,因为代码库足够大,以至于遵循客户端的代码将比其他选项快得多.
谢谢.
编辑:
应该注意的是,jni库是用Objective-C编写的原因是因为它与Mac OSX集成.它使用Cocoa框架与Apple语音api集成.
我不确定我是否完全理解你的设置,如果你要求从eclipse完成此操作.无论如何,我有兴趣使用JNI和Cocoa库做一个小测试程序,只是为了尝试调试obj-c/c代码.
我成功完成了这个设置并调试了代码.我使用IntelliJ for Java和Xcode作为objc/c部分,但在eclipse中执行java部分是一个明智的选择.
所以你应该能够准确设置我的项目结构并开始调试.从那里你应该能够将这些知识应用到你自己更复杂的代码中.
这就是我开始的方式:

libnative动态类型".
为新项目选择一个位置.我使用~/Development/并跳过该Create local git...部分.
这将创建一个lib native.xcodeproj在所选文件夹中调用的新项目.已自动创建两个文件:libnative.h和libnative.m.
首先,您必须更改项目设置.
Executable Extension在该Packaging部分必须更改dynlib为jnilib.Framework Search Paths在该Search Paths部分必须更新以指向JNI框架:/System/Library/Frameworks/JavaVM.framework/Frameworks/JavaNativeFoundation.framework/
<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
Run Code Online (Sandbox Code Playgroud)
按⌘+ 构建代码B.
现在是时候创建Java代码了.我只是在包中创建了一个名为Main的类 com.stackoverflow.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
Main.print();.使用以下JVM选项启动调试器:-Djava.library.path="/Users/maba/Library/Developer/Xcode/DerivedData/libnative-cquleqohzyhghnercyqdwpnznjdf/Build/Products/Debug/"
Run Code Online (Sandbox Code Playgroud)
这条线有点长,也是用户特定的.您将不得不自己查找目录名称,但除了生成的libnative-cquleqohzyhghnercyqdwpnznjdf路径之外,它们或多或少与我的相同.
该程序应该在断点处运行并等待.是时候将Xcode调试器连接到正在运行的应用程序了.
选择菜单Product- > Attach to Process >并指向下拉部分中的运行java过程System.如果有多个java进程,则很可能是具有最高PID的进程,但并非总是如此.你必须尝试.
在行上的c代码中创建断点printf("Hello from C");.
返回Java IDE并从停止的位置继续执行.
回到Xcode,看看它在断点处等待!

正如我之前所说,这是一个非常简单的obj-c/JNI方法,你的项目可能非常大,但是通过这个小型测试项目,你至少可以看到它是如何工作的,然后继续你自己的项目设置.
| 归档时间: |
|
| 查看次数: |
2201 次 |
| 最近记录: |