C와 C++의 JNI 통화가 다릅니까?
그래서 저는 자바 네이티브 인터페이스를 활용하는 C에 다음과 같은 코드를 가지고 있습니다만, 이것을 C++로 변환하고 싶지만 방법을 잘 모르겠습니다.
#include <jni.h>
#include <stdio.h>
#include "InstanceMethodCall.h"
JNIEXPORT void JNICALL
Java_InstanceMethodCall_nativeMethod(JNIEnv *env, jobject obj)
{
jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "()V");
if (mid == NULL) {
return; /* method not found */
}
printf("In C\n");
(*env)->CallVoidMethod(env, obj, mid);
}
Java 프로그램:
class InstanceMethodCall {
private native void nativeMethod();
private void callback() {
System.out.println("In Java");
}
public static void main(String args[]) {
InstanceMethodCall c = new InstanceMethodCall();
c.nativeMethod();
}
static {
System.loadLibrary("InstanceMethodCall");
}
}
JNI가 C와 C++와 상호작용하는 차이점은 무엇입니까?어떤 도움이라도 주신다면 대단히 감사하겠습니다.
고마워요, 피트
나는 Essential JNI라는 책을 가지고 있었습니다.그리고 그것이 약간 구식이기는 하지만(1998년), 그것의 많은 부분은 오늘날에도 여전히 작동합니다.
내가 정확히 기억한다면, C에서 자바 구조는 단순히 포인터일 뿐입니다.그러니까, 자네 암호대로라면(*env)->
는 기본 메서드에 액세스할 수 있도록 포인터를 재참조합니다.
C++인 경우env
는 사실 객체입니다 – C 포인터와는 다른 엔티티입니다. (그리고 C++는 객체를 지원하므로 JNI는 C++ 코드가 조작할 수 있는 실제 객체를 제공할 수 있습니다.) 따라서env->
C++에서 다른 의미를 갖습니다. "가 가리키는 객체에 포함된 메소드를 호출합니다.env
.
또 다른 차이점은, 많은 C-JNI 함수들이 당신의 매개변수들 중 하나가JNIEnv *env
. 그래서 C에서 당신은 이렇게 말해야 할지도 모릅니다.(*env)->foo(env, bar)
. C++를 사용하면 다음에 대한 두 번째 참조env
꼭 필요한 건 아니니까, 대신에 당신은 말할 수 있습니다.env->foo(bar)
.
아쉽게도 위의 책이 눈 앞에 없어서 확인이 잘 안 되네요!하지만 이 두 가지를 조사하는 것은 (특히 구글이나 다른 JNI 코드에서 그것들을 찾는 것) 꽤 큰 도움이 될 것이라고 생각합니다.
C와 CPP에서 JNI 호출의 주된 차이점은 다음과 같습니다.
C 스타일 JNI는 (*env)->썸제이처럼 보입니다.NIC 호출(env, param1...)
C++ 스타일 JNI env->썸제이 같아요NIC 호출(param1 ...)
CPP로 변환하려면 해야 합니다.
Java_InstanceMethodCall_nativeMethod(JNIEnv *env, jobject obj)
{
jclass cls = env->GetObjectClass(obj);
jmethodID mid = env->GetMethodID(cls, "callback", "()V");
if (mid == NULL) {
return; /* method not found */
}
printf("In C++\n");
env->CallVoidMethod(obj, mid);
//rest of your code
또한 JNI 기능이 명명 규칙을 따르도록 합니다.
예:
JNIEXPORT jint JNICALL Java_com_shark_JNITestLib_JNITestLib_startServer(JNIEnv* env, jobject o, jstring inputName, jstring streamName, jstring description) {
규약이 Java_(패키지명)_(클래스명)_(메소드명)임을 알 수 있습니다.
위의 것이 같은 수업에서 사용되었기 때문에.
package com.shark.JNITestLib
import java.util.stuff;
public class JNITestLib
{
static
{
System.loadLibrary("myJNIlib");
}
public native synchronized int startServer(String inputName, String streamName, String description);
//more class stuff...
}
JNI와 함께 작업할 때 JNI 호출이 포함된 클래스의 이름을 패키지와 동일한 이름으로 명명하는 것을 관례로 만들었습니다.JNIestLib을 두 번 보는 이유입니다.(JNI 호출의 이름을 적절하게 지정하는 방법을 항상 잊어버리기 때문에 JNI가 즉시 작동하는 이유입니다.)
건배, 내가 도와줬기를 바라요 :)
당신의 C 코드를 안에 포장해보셨나요?extern "C"
. C++와 함께 C 코드를 사용할 수 있는 기타 가능한 메커니즘에 대한 자세한 내용은 C++ FAQ Lite를 참조하십시오.
표준 C++를 만진 지 꽤 됐지만 어쨌든 시도해 볼 겁니다.
"(*env)->
" 제가 보기엔 이상해 보입니다.그냥 그렇게 해야 하지 않나요?"env->
" ?
아마 제가 틀리고 효과가 있을 거예요, 그런데 왜 일을 더 복잡하게 만드는 거죠?
언급URL : https://stackoverflow.com/questions/935379/jni-calls-different-in-c-vs-c
'programing' 카테고리의 다른 글
교차 도메인 요청에 대한 간헐적 ERR_SSL_PROTOCOL_ERROR 오류 (0) | 2023.10.20 |
---|---|
2개의 문자열을 비교하여 일치하지 않는 것을 찾습니다. (0) | 2023.10.20 |
코드 점화기의 활성 레코드 패턴을 사용한 UNION 쿼리 (0) | 2023.10.20 |
RWordPress는 어떻게 블로그 포스트 콘텐츠를 검색할 수 있습니까? (0) | 2023.10.20 |
테이블 회전, 슬라이서에서 이전 값 제거 (0) | 2023.10.20 |