Tag: jni

OSX:JavaVM,AWT / Swing以及可能的死锁

我是java编程的新手,所以如果这听起来像个愚蠢的问题,我会提前道歉。 我正在尝试构建一个用简单C编写的简单应用程序,它必须创建一个JavaVM ,然后通过加载基于AWT/Swing Java代码来创建一个新窗口。 按照本技术说明我了解到,仅在Mac OSX中,必须从与主线程不同的线程调用JavaVM,以便能够基于AWT创建GUI。 因此,在我的C应用程序的mainfunction中,我创建了一个执行所有操作的新线程,从创建javaVM到创建GUI。 由于应用程序实际上并不那么简单,我将发布一个简化版本。 主function: int main(int argc, char** argv) { // Run-time loading of JavaVM framework void *result; result = dlopen(“/System/Library/Frameworks/JavaVM.framework/JavaVM”, RTLD_LAZY); if (!result) { printf(“can’t open library JavaVM: %s\n”, dlerror()); } else { printf(“library JavaVM loaded\n”); } /* Start the thread that runs the VM. */ pthread_t vmthread; // […]

从JNI / NDK返回从C到Java的2D原始数组

我已经找到了大量关于如何在JNI中生成2D原始数组并将其返回给Java的文档。 但是这些信息无法描述如何在C中给定上下文传递已经存在的 2D浮点数组(float **)。 为了明确地描述我的问题,我将添加一些我想要实现的C伪代码: // Returns a 2D float array from C to Java jfloatArray ndk_test_getMy2DArray(JNIEnv* env, jobject thiz, jlong context) { // Cast my context reference MyContextRef contextRef = (MyContextRef) context; // In case we need it below unsigned int length = MyContextGet1DLength(contextRef); // Get the 2D Array we want to “Cast” float** […]

使用JNI中的GetDirectBufferAddress

我试图了解如何从JNI层使用GetDirectBufferAddress 。 要理解我构建了一个非常简单的例子: public class my_image_info { static { System.loadLibrary(“my_jni”); } private java.nio.ByteBuffer image_info_bb; native static void initc( java.nio.ByteBuffer bb ); my_image_info() { image_info_bb = java.nio.ByteBuffer.allocateDirect( 5 * 4 ); initc( image_info_bb ); } public java.nio.ByteBuffer getBB() { return image_info_bb; } static public void main(String argv[]) { my_image_info fii = new my_image_info(); java.nio.ByteBuffer bb = […]

如何在android项目中使用NDK?

我需要在我的项目中使用一些本机c / c ++,所以我需要使用NDK。 有没有一种简单的方法在eclipse中设置它? 谢谢。

保持对JNIEnv环境的全局引用

我将JNIEnv存储在全局中,以便稍后调用静态java方法。 但是存储一个指向JNIEnv的全局指针是不是必须的,它们可以与任何其他java对象一起存储,或者它是一个不需要它的特殊情况。 JNIEnv* globalEnvPointer; [JNICALL etc] void init(JNIENv* env, [etc]) { //required? globalEnvPointer = (JNIENv*) (env*)->GetGlobalRef(env, env); //or is this OK? globalEnvPointer = env; } 编辑 我在这里有点愚蠢,所有将使用globalEnvPointer的方法都在我的init中调用,因为我的init实际上是我的c程序的main方法,直到程序结束才会返回。 我也在c程序中没有使用其他线程。 我认为这简化了答案。 JNIEnv* globalEnvPointer; [JNICALL etc] void main(JNIENv* env, [etc]) { //required? globalEnvPointer = (JNIENv*) (env*)->GetGlobalRef(env, env); //or is this OK? globalEnvPointer = env; someMethod(); } void someMethod() […]