objective-c – 调试Objective C JNI代码
情况如下:
我在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部分是一个明智的选择. 所以你应该能够准确设置我的项目结构并开始调试.从那里你应该能够将这些知识应用到你自己更复杂的代码中. 这就是我开始的方式: >通过选择Cocoa Library在Xcode中创建一个新项目. >将项目命名为libnative,并将其命名为Type Dynamic. >为新项目选择一个位置.我使用?/ Development /并跳过Create local git …部分. >包装部分中的可执行扩展必须从dynlib更改为jnilib. >现在是时候添加一些代码了.请注意,使用此设置,您必须使用< 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构建代码. 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调试器连接到正在运行的应用程序了. 正如我之前所说,这是一个非常简单的obj-c / JNI方法,你的项目可能非常大,但是通过这个小型测试项目,你至少可以看到它是如何工作的,然后继续你自己的项目设置. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |