私はあなたのセットアップを完全に理解しているかどうか、またこれを Eclipse から行う必要があるかどうかはわかりません。とにかく、obj-c/c コードのデバッグを試すためだけに、JNI と Cocoa ライブラリを使用して、何もしない小さなテスト プログラムを作成することに興味がありました。
このセットアップとコードのデバッグに成功しました。Java には IntelliJ を使用し、objc/c 部分には Xcode を使用しますが、Eclipse で Java 部分を実行するのは非常に簡単です。
したがって、プロジェクト構造を正確にセットアップして、デバッグを開始できるはずです。そこから、この知識を独自のより複雑なコードに適用できるはずです。
これが私が始めた方法です:
- Cocoa Library を選択して、Xcode で新しいプロジェクトを作成します。
- プロジェクトに名前
libnative
を付け、Type Dynamic にします。
- コードを追加します。このセットアップでは、 を使用する必要があることに注意してください
<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 >
をポイントします。複数のプロセスがある場合、PID が最も高いプロセスである可能性が最も高くなりますが、常にそうとは限りません。あなたは試してみる必要があります。java
System
java
行の c コードにブレークポイントを作成しますprintf("Hello from C");
。
Java IDE に戻り、停止していたところから実行を続けます。
Xcode に戻り、ブレークポイントで待機していることを確認します。
前に述べたように、これは obj-c/JNI に対する非常に単純なアプローチであり、プロジェクトはおそらく非常に大きいですが、この小さなテスト プロジェクトを使用すると、少なくともそれがどのように機能するかを確認してから、独自のプロジェクトのセットアップに進むことができます。