- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我很好奇为什么 jni programming guide说
The JNI provides a slightly cleaner interface for C++ programmers. The
jni.h
file contains a set of inline C++ functions so that the native method programmer can simply write:jclass cls = env->FindClass("java/lang/String");
instead of:
jclass cls = (*env)->FindClass(env, "java/lang/String");
The extra level of indirection on
env
and theenv
argument toFindClass
are hidden from the programmer. The C++ compiler simply expands out the C++ member function calls to their C counterparts; therefore, the resulting code is exactly the same.
c 和 c++ 指针有什么区别?
最佳答案
C++
指针是指向类对象
的指针。 C
指针是指向函数
的指针。他们是两个不同的东西。
因为C++对象
已经知道环境,所以不需要再传递环境。
C
指针是指向结构的指针,您可以在该结构中调用函数。该函数没有状态,因此您需要传递状态(在本例中,相同的 env
结构,因此它可以找到该结构中的变量。)。
在 JDK
的 jni.h
中,您会看到 C++
函数是:
jclass FindClass(const char *name) {
return functions->FindClass(this, name);
}
functions
是指向env
的对象内部的指针。因此 C++
版本在内部扩展为 C
版本。
关于android - 带或不带括号的 JNIEnv 用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27353012/
我看到一些 jni 签名如下: // jni // WAY-1 JNIEXPORT void JNICALL Java_com_test_Test_testMethod(JNIEnv *env, j
我正在使用它们之间的 native 库编写一些 Java.NET 互操作代码,到目前为止一切进展顺利。 但是由于某些原因,我无法在 JNIEnv 下运行任何方法。 System::String^ JN
当我尝试从 C++ 中的线程调用 JVM 时,调试器说 JNIEnv 指针消失了。代码: void thread_call(JNIEnv* env,jobject text_view,jmethodI
我很好奇为什么 jni programming guide说 The JNI provides a slightly cleaner interface for C++ programmers. Th
我有一个使用 JNI 的 Android 项目。在实现监听器类的 CPP 文件中,有一个回调 x() 。当调用 x() 函数时,我想调用 java 类中的另一个函数。但是,为了调用该 java 函数,
我对 NDK 有疑问。 在我的 JNI_OnLoad 方法中,我缓存了 JavaVm 指针、调用该方法的类以及我稍后使用的方法 ID: JNIEXPORT jint JNICALL JNI_OnLoa
跨多个 JNI 调用缓存 JNIEnv 对象是否安全?例如,我可以做类似的事情吗 void foo(JNIEnv* env) { static JNIEnv* cached; if(
我将 JNIEnv 存储在全局中,以便稍后调用静态 java 方法。但是,存储一个指向 JNIEnv 的全局指针是否有必要,它们与任何其他 java 对象一样,或者它是一种不需要这个的特殊情况。 JN
我有一个 C++ dll,我想通过将函数导出到 C# 来在 Unity 中使用它。 Unity 项目在 Android 设备上运行,C++ 代码使用 java。要初始化 C++,我需要先调用以下函数:
在java中我有: package com.mypkg.utils; ... public class attitude_calculator { private long native_pt
我有两个文件:MyJni.cpp 是 jni 文件。而MyObject.c是一个普通的c文件。 这是 MyJni.cpp 文件的代码: JNIEXPORT void createMyObject(
JavaVM *javaVM = NULL;JNIEnv *jniEnv = NULL; ( createJavaVM )( &javaVM, ( void * )&jniEnv, &javaVMIn
在 Monodroid 中,我试图通过 JNIEnv 访问自定义 Java 类。当我在主项目中添加类时,我可以在主项目和库项目中访问它。 例如:如果 jniTest.java 是项目 A 中的 And
我是运行第一个 hello JNI 示例的 Android NDK 新手。我添加了 jni 文件夹并添加了 c 文件,其中我收到一些 Unresolved 错误。 我也将项目转换为 C/C++ 并在
了解到JNI接口(interface)指针(JNIEnv *)只在当前线程中有效。假设我在 native 方法中启动了一个新线程;它如何将事件异步发送到 Java 方法?因为这个新线程不能引用(JNI
As we know JNIEnv is the pointer to the VM. And as name suggests JavaVM is a VM itself. Is there any
我需要在我的 native 库中获取 Android 唯一设备 ID。据我所知,它可以用Java API来完成,我需要使用JNI。我读过this ,也有类似的问题,但是访问的是不同的ID。但是这个解决
我的 Main.cpp 文件中有一个这样的 JNI 调用: JNIEXPORT jstring JNICALL Java_packagename_MainActivity_Generate
我一直在尝试调用 JNIEnv 函数 GetVersion(对于初学者),其索引为 4(根据 this site )。 我一直在使用 this site供引用,并通过使用 [ebp + x] 而不是参
我对此方法的定义感兴趣。但我只找到了 jni.h 文件中的声明......我猜一定有一个实现! :)谢谢 最佳答案 jni.h 文件在其提供的定义集中是跨 JVM 的标准。实际的实现随您的 JVM 一
我是一名优秀的程序员,十分优秀!