Tag: jni

如何在opencv for android中将ArrayList 从Java传递到本机端(NDK)

在Java方面,我有 List arystrdimages = new ArrayList(); 随后,从外部目录中的文件夹读取的图像被添加到列表中 for(File f:strdimgs) { Mat tempimg = Highgui.imread(f.getAbsolutePath(),CvType.CV_8UC1); arystrdimages.add(tempimg ); } 在Native jni方面,我想通过它的引用访问arystrdimages。 对于单个mat对象,我们可以通过调用getNativeObjAddr方法来实现,即在opencv4android示例中为Mat对象进行本机访问,如下所示 Java的 private Mat mRgba; 打电话给本地人 CallNative(mRgba.getNativeObjAddr()); 在原住民方面 JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_CallNative(JNIEnv*, jobject, jlong addrRgba1){ Mat& mRgb = *(Mat*)addrRgba1; } 如何为List对象执行此操作? 编辑:实施您建议的解决方案 Java方面 int elems= arystrdimages.size(); Log.v(“Matobjdata”, “number of Matobject read = ” + elems); //Log.v(“Matobjdata”, […]

使用Grails应用程序中的JNI本机库时出现UnsatisfiedLinkError

我有一个应用程序,我需要使用本机库: libfoo.so 我的代码如下: Accessor.java: public class Accessor { static { String path = “/usr/lib/libfoo.so”; System.load(path); } … } 当我在独立的tomcat服务器中部署war文件时,这非常正常。 问题是当我运行时尝试运行嵌入式tomcat服务器时: grails run-app 我得到一个UnsatisfiedLinkError: Caused by UnsatisfiedLinkError: com.foo.bar.GFS_MALJNI.new_Accessor__SWIG_0(Ljava/lang/String;I)J ->> 39 | in com.foo.bar.Accessor 有趣的是,如果我将BuildConfig.groovy文件更改为fork模式,它也可以工作。 BuildConfig.groovy: grails.project.fork = [ run: [maxMemory:1024, minMemory:64, debug:false, maxPerm:256] ] 我不想在fork模式下运行它。

Windows 64位上的com4j

我已经下载了最新的com4jjar子,我正试图通过他们最简单的例子。 我使用64位Windows 7并使用64位JVM。 当我运行命令时(来自com4j教程): java -jar tlbimp.jar -o wsh -p test.wsh %WINDIR%\system32\wshom.ocx 我明白了: Exception in thread “main” java.lang.UnsatisfiedLinkError: com4j-amd64.dll: %1 is not a valid Win32 application at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(Unknown Source) at java.lang.ClassLoader.loadLibrary(Unknown Source) at java.lang.Runtime.load0(Unknown Source) at java.lang.System.load(Unknown Source) at com4j.COM4J.loadNativeLibrary(COM4J.java:569) at com4j.COM4J.(COM4J.java:522) at com4j.tlbimp.driver.Lib.getLibid(Lib.java:90) at com4j.tlbimp.driver.Driver.addLib(Driver.java:38) at com4j.tlbimp.driver.Main.doMain(Main.java:123) at com4j.tlbimp.driver.Main.main(Main.java:56) Exception in […]

如何通过JNI将HashMap从Java发送到C.

我有一个具有HashMap字段的Object 。 当Object传递给C时,如何访问该字段? Object的Class包含以下字段: private String hello; private Map params = new HashMap();

将指针从C传递到Java变为NULL

我正在开发一款适用于x86的Android应用程序,它需要与C进行一些集成。我一直在使用swig / JNI来完成这项工作,而且大部分内容都在顺利运行。 但是,指针一直给我一些错误。 我的问题是我能够在模拟器(ARM)中成功引用变量地址,但在设备(x86)上,事情并不顺利。 使用此链接中的示例,我发现一旦此地址转移到Java,C中任何已分配变量的地址都将变为NULL。 例如… Swig生成的JNI: SWIGEXPORT jlong JNICALL Java_exampleJNI_new_1intp(JNIEnv *jenv, jclass jcls) { jlong jresult = 0 ; int *result = 0 ; (void)jenv; (void)jcls; result = (int *)new_intp(); LOGI(“Result is %x”, result); *(int **)&jresult = result; LOGI(“JResult is %x”, jresult); return jresult; } 包含new_intp()的源文件: static int *new_intp() { return (int *) […]

如何重新配置​​eclipse以使用64位JVM

我正在使用eclipse,我认为这些都是64位运行时环境。 当前设置Java>已安装的JRE和执行环境都指向jdk1.6.0_30,这是JDK的64位版本。 但是,eclipse仍然认为它运行的是32位版本,因为当我运行时: System.getProperty( “sun.arch.data.model”); 它返回32而不是64。 我为64位计算机编译的外部JNI资源不会链接到共享的.so文件,除非它在64位环境中运行。 (当我尝试这样做时,我的字大小不匹配错误) 那么如何重新配置​​eclipse以运行64位jvm。 eclipse本身必须是64位版本吗? :在linux上 编辑:我已经尝试了每个人的建议,没有任何工作。 我已将执行和环境变量更改为指向我最新的JDK,即1.6_30。 当我从命令行运行程序时,我得到64和amd64作为值,当我在eclise中运行相同的程序时,我得到32和i386。 在eclipse中出现问题导致它尝试在32位JVM上运行它。 当我尝试java -d32 -version时,它说没有安装32位环境,但Eclipse不知道。 我已经修改了Eclipse.ini文件但仍然无法正常工作。 在这些变化之后我重新启动了eclipse ……没有。 一个知道日食的人可以帮助我。 谢谢

是否可以通过JNI将静态库链接到Java?

是否可以构建HelloWorld.lib并使用JNI将其加载到Java应用程序? 或者它只适用于共享库? 我无法在JNI文档中找到明确的答案,没有提到“静态库”。

UnsatisfiedLinkError:找不到指定的过程

我正在用C ++编写一些JNI代码,用于从Windows XP上的applet调用。 我已经能够成功运行applet并加载和调用JNI库,甚至可以调用其他DLL中的函数。 我通过设置PATH系统环境变量来包含我所有DLL所在的目录。 所以,问题是我添加了另一个使用新外部DLL的调用,并且在加载库时突然抛出了UnsatisfiedLinkError。 消息是:’找不到指定的过程’。 这似乎不是一个缺少依赖DLL的问题,因为我可以删除一个从属DLL并获得有关从属DLL丢失的不同消息。 从我在网上找到的内容来看,似乎这个消息意味着DLL中缺少本机Java函数实现,但奇怪的是它没有这些额外的代码就能正常工作。 有谁知道这可能导致什么? 什么类型的东西可以为UnsatisifedLinkError提供’指定的过程无法找到’消息?

JNI – multithreading

我有一个JNI包装器用于从C调用的Java函数…我试图从不同的线程调用一些方法,并且在尝试获取JNIEnv指针的新副本时遇到错误…代码我’ m using在下面,并在每种方法中调用: JNIEnv* GetJniEnvHandle(){ ThreadInfo(); JNIEnv *envLoc; //if(Thread::CurrentThread->IsBackground || Thread::CurrentThread->IsThreadPoolThread) jint envRes = vm->GetEnv((void**)&envLoc, JNI_VERSION_1_4); if(envRes == JNI_OK){ if(ThreadId != Thread::CurrentThread->ManagedThreadId) jint res = vm->AttachCurrentThread((void**)&envLoc, NULL); }else{ Log(“Error obtaining JNIEnv* handle”); } return envLoc; } JVM已经被实例化,并且当从主/初始线程调用时,此(和其他方法)运行。 当我得到envRes的值时,它在子线程中保持-2。

JNI释放内存以避免内存泄漏

所以我有这个从我的Java程序通过JNI调用的C ++程序,代码如下: JNIEXPORT jstring JNICALL Java_com_entrust_adminservices_urs_examples_authn_LdapAuthenticator2_takeInfo(JNIEnv *env, jobject obj, jstring domain, jstring id, jstring idca, jstring password) { const char *nt_domain; const char *nt_id; const char *nt_password; HANDLE hToken = 0; bool aut = false; nt_domain = env->GetStringUTFChars(domain, NULL); nt_id = env->GetStringUTFChars(id, NULL); nt_password = env->GetStringUTFChars(password, NULL); aut = LogonUser(nt_id, nt_domain, nt_password, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &hToken […]