objective-c – 调试Objective C JNI代码

objective-c – 调试Objective C JNI代码,第1张

概述情况如下: 我在eclipse中打开了一个客户端的java项目.它使用由Xcode Objective C项目创建的JNI库.在执行Java代码时,有没有什么好方法可以从eclipse调试C代码?显然,eclipse的默认调试器无法进入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 …部分.
>这将在您选择的文件夹中创建一个名为lib native.xcodeproj的新项目.已自动创建两个文件:libnative.h和libnative.m.
>首先,您必须更改项目设置.

>包装部分中的可执行扩展必须从dynlib更改为jnilib.
>框架搜索路径的搜索路径部分必须被更新为指向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 __cplusplusextern "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调试器连接到正在运行的应用程序了.
>选择菜单产品 – >附加到流程>并指向下拉列表的System部分中正在运行的java进程.如果有几个java进程,则很可能是具有最高PID的进程,但并非总是如此.你必须尝试.
>在printf行的c代码中创建一个断点(“Hello from C”);.
>返回Java IDE并从停止的位置继续执行.
>回到Xcode,看看它在断点处等待!

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

总结

以上是内存溢出为你收集整理的objective-c – 调试Objective C JNI代码全部内容,希望文章能够帮你解决objective-c – 调试Objective C JNI代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1026378.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存