标签: java-native-interface

混合C++/Qt/Java应用程序

我正在研究混合的C++/Qt/Java应用程序.我在使用JNI启动JVM之前从C++端打开QtSplashScreen.关闭QtSplashScreen时出现问题.我希望在C++端有一个回调,当应用程序准备好运行时,它会被Java端调用.但是,似乎当使用JNI或JNA从Java调用C++时,我需要将C++代码编译为共享库,这会破坏所有QtSplashScreen内部依赖项.有任何想法吗?

谢谢.

c++ java java-native-interface qt jna

1
推荐指数
1
解决办法
747
查看次数

释放JNI阵列

我正在用C++实现一个回调函数,但我遇到了一些泄漏问题.

数组创建的实现:

jshortArray convertShortArrayToJNI(JNIEnv* env, short* arr, size_t count) {
  jshortArray retval = env->NewShortArray(count);
  env->SetShortArrayRegion(retval,0,count,arr);
  return retval;
}
Run Code Online (Sandbox Code Playgroud)

这里回调电话:

short* audio_frame;
int size;
jobject* callbackObject;
jshortArray array = convertShortArrayToJNI(jenv, audio_frame, size);
LOGI("array %d", array);
jenv->CallVoidMethod(*callbackObject, callbackMI, array);
LOGI("callback called!");
jenv->ReleaseShortArrayElements(array, audio_frame, 0);
Run Code Online (Sandbox Code Playgroud)

一些电话后,它显示以下错误:

12-03 11:12:38.425: W/dalvikvm(894): ReferenceTable overflow (max=512)
12-03 11:12:38.425: W/dalvikvm(894): Last 10 entries in JNI local reference table:
12-03 11:12:38.425: W/dalvikvm(894):   502: 0x44f879b0 cls=[S (100 bytes)
12-03 11:12:38.435: W/dalvikvm(894):   503: 0x44f87a98 cls=[S (100 bytes)
12-03 11:12:38.435: W/dalvikvm(894):   504: …
Run Code Online (Sandbox Code Playgroud)

c++ java java-native-interface android callback

1
推荐指数
1
解决办法
2350
查看次数

如何在Eclipse中创建JNI android项目

我想在eclipse juno中创建一个基于JNI的Android项目.

如何使用Java和C++在android中创建一个简单的"Hello World"项目.是否有任何教程可以帮助我使用JNI上述应用程序.

通过运行应用程序,它显示以下错误

在此输入图像描述

java-native-interface android

1
推荐指数
1
解决办法
8333
查看次数

如何分析本机JNI库

如何剖析用C编写的Java本机接口库?

我了解通常的C探查器,但是我的问题是我如何探查整个集合,包括对JVM方法的调用,这可能会使程序变慢。

c java java-native-interface profiling jvm

1
推荐指数
1
解决办法
2491
查看次数

JNIEnv全局引用与C中的jobject有何不同?

到目前为止,我已将JNI环境和作业对象保存在本地.我发现,为了我的JNI运行ICS和up设备,我需要修复我的JNI代码.这是我得到的错误:

02-20 10:20:59.523: E/dalvikvm(21629): JNI ERROR (app bug): attempt to use stale local reference 0x38100019
02-20 10:20:59.523: E/dalvikvm(21629): VM aborting
02-20 10:20:59.523: A/libc(21629): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 21629
Run Code Online (Sandbox Code Playgroud)

我对如何创建/销毁这些全局变量感到困惑,如果我甚至做得对.

我的应用程序目前在使用此代码的所有pre-ICS设备上正常运行:

BYTE Java_my_eti_commander_RelayAPIModel_00024NativeCalls_InitRelayJava( JNIEnv *env, jobject obj  ) {

    myEnv = (env);
    myObject = obj;

    changeID = (*myEnv)->GetStaticMethodID( myEnv, myObject, "changeItJavaWrapper", "(S)V"  );
    getID    = (*myEnv)->GetStaticMethodID( myEnv, myObject, "getItJavaWrapper"   , "(S)S"   );
    putID    = (*myEnv)->GetStaticMethodID( myEnv, myObject, "putItJavaWrapper"   , "(B)V" );
    flushID  = (*myEnv)->GetStaticMethodID( myEnv, myObject, "flushItJavaWrapper" …
Run Code Online (Sandbox Code Playgroud)

c java-native-interface android jnienv

1
推荐指数
1
解决办法
2481
查看次数

Matlab + Java + JNI:java.lang.UnsatisfiedLinkError

使用Matlab与Java和JNI,我得到一个我无法理解的UnsatisfiedLinkError.

首先,我从Matlab命令行加载本机库.有用:

>> java.lang.System.load('/usr/local/share/OpenCV/java/libopencv_java.so')
Run Code Online (Sandbox Code Playgroud)

然后我调用用本机库实现的Java函数:

>> org.opencv.core.Mat

   Java exception occurred:
   java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat()J
    at org.opencv.core.Mat.n_Mat(Native Method)
    at org.opencv.core.Mat.<init>(Mat.java:441)
Run Code Online (Sandbox Code Playgroud)

它抱怨它无法找到org.opencv.core.Mat.n_Mat()J,但该符号位于.so中:

echristiansen@jnu:/usr/local/share/OpenCV/java$ nm libopencv_java.so | grep Mat_n_1Mat
0000000000027780 T Java_org_opencv_core_Mat_n_1Mat__
00000000000316c0 T Java_org_opencv_core_Mat_n_1Mat__DDI
00000000000312a0 T Java_org_opencv_core_Mat_n_1Mat__DDIDDDD
00000000000318a0 T Java_org_opencv_core_Mat_n_1Mat__III
00000000000314b0 T Java_org_opencv_core_Mat_n_1Mat__IIIDDDD
0000000000030fa0 T Java_org_opencv_core_Mat_n_1Mat__JII
0000000000031120 T Java_org_opencv_core_Mat_n_1Mat__JIIII
Run Code Online (Sandbox Code Playgroud)

因此,如果它使用正确的符号加载本机库,为什么我会收到UnsatisifiedLinkError?

java java-native-interface matlab unsatisfiedlinkerror

1
推荐指数
1
解决办法
1889
查看次数

为Android(移动设备)编写OpenCV和为桌面应用程序编写openCV(使用C++的OpenCV 2.4.3)之间的区别

我正在做面部检测和识别项目.我即将完成检测和识别的应用程序.我想让这个应用程序像移动设备一样可移植.我不熟悉在Androids上使用OpenCV编写代码.Android手机的OpenCV代码和使用C++在Visual Studio上为Open Desktop编写的OpenCV有什么区别,如VS 2010和Open CV 2.4.3?(Android上OpenCV和OpenCV for Desktop之间的代码有什么区别.他们俩都有使用相同的语言?) 我熟悉Android(基础知识),并且Android应用程序是用Java编写的.我在网上看到,OpenCV本机代码可以通过Java Native Interface 包含在Android中.我在这里有点困惑,我可以使用我使用C++ Open CV为我的Android应用程序编写的代码而不进行修改.如果不是我必须使用C++ for Desktop进行面部检测和识别的修改它适用于Android手机?

java-native-interface android opencv image-processing

1
推荐指数
1
解决办法
2440
查看次数

忽略JNI C++代码中的错误,eclipse

嗨我在android中使用JNI,eclipse.

首先,我尝试使用JNI在OpenCV中运行演示.即使程序在我的Android手机中编译和运行,当我出于好奇心在JNI文件夹中打开C代码时,该项目在该文件中显示无数错误,项目将永远不会编译.

我认为这是因为eclipse无法正确解析C代码,但JNI实用程序可以处理它们.

那么有没有办法在IDE中抑制这些错误以使其编译?

(我预测android会在android开发中经常出现这些问题.)

更新

**** Build of configuration Default for project OpenCV Sample - face-detection ****

G:\progWorkSpace\Android\Tegra\tadp_download\android-ndk-r8d-windows\android-ndk-r8d\ndk-build.cmd 
Install        : libdetection_based_tracker.so => libs/armeabi-v7a/libdetection_based_tracker.so

**** Build Finished ****
Run Code Online (Sandbox Code Playgroud)

CDT成功构建.

eclipse java-native-interface android

1
推荐指数
1
解决办法
2005
查看次数

JNI:使用对象作为参数在C++中调用Java方法

我是JNI的新手,并且给出了一个Java程序,我想从中调用C++中的方法.我有一个用Java实现的ObjectA.我在C++中收到这样的classID:

jclass cls = env->FindClass("myPackages/ObjectA");
Run Code Online (Sandbox Code Playgroud)

现在我有了Java中给出的方法funcA.funcA接受ObjectA类型的Object作为参数并返回一个整数.Java中的声明如下所示:

public int funcA( ObjectA obj);
Run Code Online (Sandbox Code Playgroud)

现在我想在C++中获取funcA的methodID.问题是,我不知道如何指定方法获得的参数类型.我知道我必须写L完全合格的班级; 传递像String一样的对象,但是当对象不是来自官方javalibraries而是我创建的对象时,我该怎么做呢?我尝试过这个,但显然不起作用:

jmethodID jfuncA = env->GetMethodID(cls, "funcA", "(Lcls;)I");
Run Code Online (Sandbox Code Playgroud)

我得到的所有答案都是找不到方法.那么我需要写什么而不是(Lcls;)?或者这不可能吗?

任何想法都很有用!

java-native-interface

1
推荐指数
1
解决办法
1784
查看次数

JNI jni/cyberlevel9.c:17:31:错误:请求成员'NewDirectByteBuffer'的东西不是结构或联合

当我尝试构建时Eclipse给出了这个错误:

jni/cyberlevel9.c:17:31: error: request for member 'NewDirectByteBuffer' in something  not a structure or union
jni/cyberlevel9.c:18:28: error: request for member 'NewGlobalRef' in something not a structure or union
Run Code Online (Sandbox Code Playgroud)

这是代码的问题部分:

JNIEXPORT jobject JNICALL Java_com_cyberbg_natcamlevel9_NativeCameraLevel9Start_allocNativeBuffer(JNIEnv* env, jobject this, jlong size)
{
void* buffer = malloc(size);
jobject directBuffer = env->NewDirectByteBuffer(buffer, size);
jobject globalRef = env->NewGlobalRef(directBuffer);

return globalRef;
//return (NewDirectByteBuffer*)(*env)->NewDirectByteBuffer(buffer, size);
}
Run Code Online (Sandbox Code Playgroud)

c c++ eclipse java-native-interface android

1
推荐指数
1
解决办法
1705
查看次数