Tag: jni

使用Eclipse构建Android的原生Opencv,给出了“未定义的对`cvCreateFileCapture’的引用”

我正在开发一个带有原生部分的应用程序,它使用嵌入式OpenCV从video文件中提取帧。 到目前为止,我收到了这个错误: …/jni/ocv.c:12: undefined reference to `cvCreateFileCapture’ 我的Android.mk: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := ocv LOCAL_SRC_FILES := ocv.c include $(BUILD_SHARED_LIBRARY) Application.mk: APP_STL := gnustl_static APP_CPPFLAGS := -frtti -fexceptions APP_ABI := armeabi ocv.c: #include #include #include #include #include #include jstring Java_com_ice_salvador_MainActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) { IplImage* currFrame = 0; CvCapture* cap = 0; cap […]

Monodroid JNI for Javareflection调用私有方法

在Monodroid项目中,我需要能够在类上调用私有方法。 从相关问题的答案来看,似乎这可以通过反思在Java中实现: import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import android.os.ParcelFileDescriptor; … ParcelFileDescriptor pipe[] = null; try { Method createPipeMethod = ParcelFileDescriptor.class.getDeclaredMethod(“createPipe”); pipe = (ParcelFileDescriptor[]) createPipeMethod.invoke(null); } catch (NoSuchMethodException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } 我需要使用Monodroid的代码。 不幸的是, java.lang.reflect在Monodroid中不可用 。 但是,有人建议我可以使用Monodroid项目中的JNI运行此代码。 Xamarin文档声明内联JNI是可能的 ,而不必绑定整个JAR。 […]

android加载库失败

当我使用System.loadLibrary()加载我的so文件时,很少,它失败了,而Logcat说 Cannot load library: reloc_library[1286]: 121 cannot locate ‘__cxa_atexit’ java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1285]: 169 cannot locate ‘__cxa_atexit’… at java.lang.Runtime.loadLibrary(Runtime.java:370) at java.lang.System.loadLibrary(System.java:535) 在搜索互联网后,我没有找到任何有关的信息 cannot locate ‘__cxa_atexit’ (尤其是关键词__cxa_atexit)。 为什么找不到这个function? 这个函数似乎在libc.so中。 我不在我的本机代码中使用C ++,只有C.我的NDK版本是android-ndk-r10e。 我认为“找不到__cxa_atexit”可能是一个相对的线索。 大多数时候(也许数十亿的app开始),它可以很好地工作,但很少像上面那样崩溃。 换句话说,我不能让它在我的测试手机上崩溃,但是,它会在某些用户身上很少崩溃。 此问题可能与另一个问题相同。 UPDATE 这次崩溃发生的大多数手机都是android 4.0.3和android 4.0.4。 这两个版本都是API-15。 UPDATE 在阅读了一些Android的源代码后,我发现这个问题可能与dlopen有关。 错误消息“无法加载库:reloc_library …”来自在运行时被劫持的函数dlopen。 跟踪是运行时dlopen – > find_library – > init_library – > link_image – […]

对象数组(2d数组)JNI数组

我正在努力创建自定义对象类型ShareStruct的二维数组: jobjectArray ret ; jobjectArray ins ; jobjectArray outs; jclass myClass = (*env)->FindClass(env,”org/apache/s4/core/ShareStruct”); if (myClass==NULL) fprintf(stderr, “Class ShareStruct not found”); jclass myClassArray = (*env)->FindClass(env, “[Lorg/apache/s4/core/ShareStruct”); if (myClassArray==NULL) fprintf(stderr, “Class ShareStruct[] not found”); ins = (*env)->NewObjectArray(env, in, myClass, NULL); outs = (*env)->NewObjectArray(env, out, myClass, NULL); ret = (*env)->NewObjectArray(env, 2, myClassArray, NULL); 第一个类加载工作(ShareStruct很好),但另一个(尝试加载ShareStruct []类)没有。 无论有没有L,我都尝试过,但没有运气。 有任何想法吗? 我是JNI的新手。 […]

通过JNI部署JRE:jvm.dll不能在Windows上运行或

所以我正在创建一个将Java Runtime Environment(JRE)打包为资源的Win32应用程序。 应用程序将资源提取到磁盘并解压缩。 现在,我想使用此JRE以使用调用API运行Java程序。 一旦我改为程序指向提取的JRE的jvm.dll而不是安装的JRE(这是我复制的),我收到此错误: \ jre1.8.0_31 \ bin \ server \ jvm.dll要么不是设计为在Windows上运行,要么包含错误。 尝试使用原始安装介质再次安装程序,或与系统管理员或软件供应商联系以获取支持。 错误状态0x000012f 我希望对这个问题做的是记录这个错误以及导致它的原因。 如果可能的话,找到一个解决方案,以便我可以引用提取的JRE。 让我举一些具体的环境。 首先,我正在运行Windows 10 Tech Preview。 我的操作系统,我的程序和我从安装中复制的JRE都是64位的。 此外,当我的程序指向已安装的JRE时,它工作正常,问题仅在于复制的JRE。 还有一些代码可以参考我正在做的事情: typedef jint (JNICALL *CreateJVMFunc)(JavaVM **pvm, void **penv, void *args); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //For brevity I am omitting the extraction/unzipping. //I am […]

如何在JNI中将int转换为String(?)?

我有一个int []数组,我想在JNI中将它的每个元素转换为String (?),最后将它们连接成一个String (?)(包括逗号)。 例如: // java code int testIntArray = new int[]{1, 2, 3}; String arrayString = “”; jni.constructArrayString(testIntArray, arrayString); // the print content should like this: 1,2,3 System.out.println(“ArrayString: ” + arrayString); // jni code JNIEXPORT void JNICALL constructArrayString (JNIEnv *env, jobject obj, jintArray jArr, jstring jstr) { // to do sth. // code […]

将数组从JNI传递到Java

我想访问从JNI到Java的数组(通过创建共享库libtest.so文件) 我这样做如下: JNI代码(C) int size = 5; /* Array Size */ char sample_arr[size] = {1, 2, 3, 4, 5}; /* Array to be accessed in Java */ jbyteArray result_arr = (*env)->NewByteArray(env, size); (*env)->SetByteArrayRegion(env, result_arr, 0, size, sample_arr); jmethodID mid = (*env)->GetMethodID(env, cls, “callback”, “(I)V”); (*env)->CallVoidMethod(env, obj, mid, get_event); 我相信JNI中的jbyte是等效的。 编译上面的代码以形成共享对象libtest.so 。 Java代码 public class Callbacks […]

如何避免两次调用System.load?

我有一个类调用本机函数来从CMOS获取有关系统的信息。 该类有一个静态初始化块,它加载包含本机函数的库,它看起来像这样: package lib.sysid; public class SysId { private static native int getSysIdNative(); private static final String SYS_ID_PATH = “libsysid.so”; static { System.load(SYS_ID_PATH); } public static int getSysIdFromCMOS() { int returnValue = getSysIdNative(); } } 根据我的测试,该方法在我第一次使用时工作正常,但如果我稍后再次调用该方法,静态初始化块也会运行,导致UnsatisfiedLinkError: java.lang.UnsatisfiedLinkError: Native Library libsysid.so already loaded in another classloader 如果已经运行了System.load()方法,如何避免静态初始化块执行? 或者,如果已经加载库,再次调用System.load()方法之前,有没有办法尝试“卸载”库? 编辑:奇怪的是,如果我用try-catch块包围System.load()调用,我仍然会得到一个UnsatisfiedLinkError,但这次它来自对getSysIdNative()的实际调用。 我看到的错误如下: lib.sysid.SysId.getSysIdNative()I 什么是“我”出现了? 我试图将调试器附加到此代码以查看消息的填充位置,但到目前为止我还没有成功。

如何自动将数据复制到新的RMI线程?

我正在调整一个小的rmi客户端 – 服务器应用程序。 我写过几件事: HelloInterface -> A Hello World interface for RMI Server -> The server app’ Client -> The client app’ 没什么特别的,但是……我已经把手放在一个新的RMISecurityManager中,它调用一个JNI方法并检查一个单独用户的权限: package rmi; import java.rmi.RMISecurityManager; import java.io.*; public class NativeRMISecurityManager extends RMISecurityManager { private boolean unix; protected static ThreadLocal user = new ThreadLocal(); /* * On interdit l’utilisation du constructeur par defaut * […]

JNI获取exception信息 – 尝试读取或写入受保护的内存

我正在使用以下代码尝试在java中获取类RWException(它扩展了Exception),以便我可以调用方法“getCode()”来检索错误代码(int)并正确处理错误。 我浏览了JNI文档并创建了以下代码…问题是当我尝试调用无参数方法getCode()时,我得到一个AccessViolationexception。 我得到了类的有效句柄和我正在寻找的方法ID。 jstring o = (jstring)envLoc->CallStaticObjectMethod(cls, mid, jstrUser, jstrPass, jstrGroup); jthrowable exc = envLoc->ExceptionOccurred(); if (exc) { // Get the class jclass mvclass = env->GetObjectClass( exc ); // Get method ID for method jmethodID mid = env->GetMethodID(mvclass, “getCode”, “()I”); // Call the method jint code = env->CallIntMethod(mvclass, mid); } 这个代码在使用以下信息调试inVS.NET时给了我一个例外: 尝试读取或写入受保护的内存 UPDATE这是我希望通过上面的JNI代码调用的java方法: public int […]