Articles of jni

Java JNI与Android NDK

有人可以解释一下Java JNI和Android NDK是如何不同的,它们是如何相同以及它们如何组合在一起的? 我没有发现任何可以很好地解释两者之间差异的东西,我有点困惑。 谢谢!

无法在任意上下文中获取JNIEnv *值

我有NDK的问题。 在我的JNI_OnLoad方法中,我缓存JavaVm指针,调用该方法的类以及稍后使用的方法ID: JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved){ JNIEnv *env; cachedJVM = jvm; if((*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_6)){ LOG_ERROR(“Could not get JNIEnv*”); return JNI_ERR; } javaClass = (*env)->FindClass(env, “org/test/opensl/AudioProcessor”); if(javaClass == NULL){ LOG_ERROR(“Could not get java class”); return JNI_ERR; } javaCallbackMID = (*env)->GetMethodID(env, javaClass, “enqueueAudio”, “([B)V”); if(javaCallbackMID == NULL){ LOG_ERROR(“Could not get method identifier”); return JNI_ERR; […]

OpenCV nMatToBitmap断言失败

我在使用OpenCV for Android中的一些通用函数时遇到以下错误 12-05 21:08:55.486: E/cv::error()(6658): OpenCV Error: Assertion failed (src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols) in void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean), file /home/oleg/sources/opencv/modules/java/generator/src/cpp/utils.cpp, line 107 12-05 21:08:55.486: E/org.opencv.android.Utils(6658): nMatToBitmap catched cv::Exception: /home/oleg/sources/opencv/modules/java/generator/src/cpp/utils.cpp:107: error: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols in function void […]

OpenCV for Android:将Image转换为Greyscale的简单示例

作为首发,我只想通过OpenCV将Bitmap转换为灰度。 我已经运行了一切,但是只要我想将图像转换为灰度,它就会崩溃。 任何人都可以帮忙吗? 我希望这些片段足够,如果不是我可以附上其余的片段。 java文件的一部分: // convert to opencv structure Mat image = new Mat(); Mat grayimage = new Mat(); Utils.bitmapToMat(b2, image); // call opencv for processing grayimage = convertToGray (image); // convert back Utils.matToBitmap(grayimage, b2); JNI cpp文件: JNIEXPORT jlong JNICALL Java_com_my_sample_MainMenuActivity_convertToGray (JNIEnv*, jobject, jlong addrRGBA) { LOGI(“Converting to Gray.”); Mat *mRGBA = (Mat*)addrRGBA; Mat […]

编译android jni示例时出错:invalid -march = option:`armv5te’

当我尝试编译一些android ndk示例时,我总是会收到此错误: $ cd ~/Dev/Android/ndk/samples/hello-jni $ ~/Dev/Android/ndk/ndk-build Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver Gdbsetup : libs/armeabi/gdb.setup Compile thumb : hello-jni <= hello-jni.c Assembler messages: Fatal error: invalid -march= option: `armv5te' make: *** [obj/local/armeabi/objs-debug/hello-jni/hello-jni.o] Error 1 我或我的系统出了什么问题?

JmethodID的NewGlobalRef

我有一个问题,否则似乎是一件容易的事。 我有一个本机方法,它返回一个Java类(自定义)实例的jobjectArray。 我所做的是获取我的类的jclass我要实例化并返回,然后获取它的构造函数的jmethodID。 本机方法的签名是: JNIEXPORT jobjectArray JNICALL Java_com_mn_rootscape_utils_NativeMethods_getFilesPermissions( JNIEnv* env, jobject thizz, jobjectArray filePathsArray ) 命名空间和构造函数签名定义如下: const char* kFilePermissionInfoPath = “com/mn/rootscape/utils/FilePermissionInfo”; const char* kFilePermInfoConstructorSig = “(IIIIIJJJLjava/lang/String;Ljava/lang/String;ZLjava/lang/String;)V”; 对于jclass和jmethodID,我按照这里发布的说明操作。 所以我得到他们的全球参考,以便我以后可以使用它们。 请注意,我的lib中还没有oninit,代码仅供测试。 问题是当我尝试检索jmethodID的全局引用时,我遇到了分段错误。 执行此操作的代码是: jclass filePermInfoCls = (*env)->FindClass(env, kFilePermissionInfoPath); if(!filePermInfoCls) { LOGE(“getFilesPermissions: failed to get class reference.”); return NULL; } gFilePermInfoClass = (jclass)(*env)->NewGlobalRef(env, filePermInfoCls); LOGI(“got gFilePermInfoClass”); jmethodID filePermInfoClsConstructor […]

NDK:如何构建一个lib,以便app可以在arm,s86,x86等上运行?

我之前从未使用过c ++ for android和NDK。 当我使用它 – 比如 – image processing时,我想确保应用程序可以在所有Android 2.2及更高版本的设备上运行。 当我为iPhone编写时,xcode为arm7和arm7s架构编译了2个二进制文件,并将它们打包到同一个包中。 现在我已经编写了一个示例NDK应用程序,它不想在我的Nexus 7上运行良好的x86 android模拟器上运行。我认为很明显应该是让它在arm和x86上运行的方式,但仍然可以找不到它。 有人知道吗? 谢谢!

在jni android中返回字节数组?

我需要从jni到Java获取字节数组。 例如:我有一个字节数组byte [] a = {1,2,3,4,5,6} JNIEXPORT jbyteArray JNICALL Java_com_vn_getArray (JNIEnv *env, jobject obj) { jbyte[] a = {1,2,3,4,5,6}; return a; } 我不知道如何从jni返回一个字节数组。 有人能帮我吗? 请!

C ++和JNI – 如何将数组传递给jfloatArray

我一直在搞乱自己的小项目,用c ++和jni自学android ddk,但我无法弄清楚如何将数据从java float数组传递给c ++数组。 我使用了jni设置。 我find的大多数教程要么太简单,要么解释不够,要么太复杂,现在还不能理解。 那么,有人可以指出一个简单的例子,一个数组从java传递到c ++,然后对数据执行一些方法/函数并发送回java。 继续我的尝试到目前为止,但我还有两个错误。 我不确定语法的其余部分是否符合标准但我在编译时没有看到任何内容。 #include #include #include #include using namespace Eigen; Vector3f vec; Vector3f vec2; Vector3f vecRtrn; void vecLoad(float x, float y, float z, float x2, float y2, float z2){ vec(0) = x; vec(1) = y; vec(2) = z; vec2(0) = x2; vec2(1) = y2; vec2(2) = z2; […]

写在JNI Android中的stdout? 没有

我已经更改了android ndk的HelloJni示例,我想写一些东西到stdout。 这是Jni代码: #include #include #include jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) { printf(“Hello from C !\n”); return (*env)->NewStringUTF(env, “Hello from JNI !”); } 这是我的日志: 09-28 13:07:02.906: I/ActivityManager(1650): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.hellojni/.HelloJni u=0} from pid 1790 09-28 13:07:03.007: D/dalvikvm(1650): GC_FOR_ALLOC freed 687K, 10% free 9300K/10247K, paused 62ms, total 62ms 09-28 13:07:03.070: D/dalvikvm(3562): Not […]