通过JNI传递、返回并转换为向量列表的列表
我需要从java 传递 List > points; 在jni上到c ++,然后转换为 std::vector > 处理此向量并返回 List > 列表的正确通过和返回列表如何正确? 如何转换对象向量和向后的对象列表的列表? 解决方案 我用标准工具解决了这个问题. 在Java类中创建为对象(O)容器(C) 将对象(O)从Java代码传递到本机部件 从C ++代码中的数组向量创建 计算新向量 构建容器(C)的数组,然后插入对象(O) 容器的返回数组(C) 代码实施: 在Java部分: 1-从点列表中创建数组 在C ++零件上: 2-构建输入向量 std::vector src_line; jclass java_points_cls = env->FindClass("my
0 2023-09-29
编程技术问答社区
ReleaseStringUTFChars对std::string不起作用
我在我的JNI函数中使用std :: String,并且我无法使用breasestringutfchars发布它. 我得到的错误是: 错误:呼叫Nienv :: breasestringutf env-> breasestringutfchars(path,dir); 没有匹配函数 我明白,该功能希望获得char,而不是字符串,但是我没有那么多变量.我该怎么办? 这是我的JNI函数: void Java_com_example_android_OpenCVActivity_test (JNIEnv * env, jclass clazz, jstring path){ std::string dir = env->GetStringUTFChars(path, 0); .... env->ReleaseStringUTFChars(path, dir); } 解决方案 您需要将其传递到与从GetStringUTFChars().中获得的相同的值
0 2023-09-29
编程技术问答社区
JNI printf to log4j
我通过Java的JNI调用一些C代码. 在我的C中,我要使用log4j登录的多个printf. printf("Could not find HID device\n"); fflush(stdout); 它们在Eclipse控制台中很好地显示,Log4J我将Stdout重定向到我的记录器: System.setOut(new PrintStream(new OutputStreamLogger(log, Priority.DEBUG), true)); 当我调用" system.out.println"时,它写入我的日志文件. 但是JNI printfs没有. 他们不是在Stdout吗? 我该如何将它们放入我的日志文件中? 解决方案 您可以做的一件事是在JNI Core内使用 dup 和 dup2 .这样,您可以将stdout与log4j使用的文件相关联. int newStdout(const char
0 2023-09-29
编程技术问答社区
如何用JNI将C程序的终端输出重定向到System.out?
我正在通过JNI调用一个C库,该库打印到Stdout.如何将此输出重定向到System.out? 解决方案 System.out 是 stdout.您还有一些您遇到的基本问题(也许混合了输出?). 由于另一个成员也提到了最后一点 - 我应该进一步解释: System.out和stdout都对应于文件描述符#1. 但是,Java的OutputStream(以及派生的类)和C的stdio库都有其自己的(独立)缓冲机制,以减少对基础write系统调用的调用数量.仅仅因为您已经打电话给printf或类似,因此不能保证您的输出会直接出现. 由于这些缓冲方法是独立的,因此(理论上)在Java代码中的输出可能会混合在一起,或者以其他方式相对于C代码的输出而出现差额. 如果这是一个问题,则应在调用JNI函数之前和C函数(如果使用stdio而不是低级write呼叫)之前安排System.out.flush() System.out.flush(),则应调用返回之前.
0 2023-09-29
编程技术问答社区
将静态库与JNI链接
java版本先前的java 8要求本机代码在共享库中,但是我已经阅读了使用Java 8,可以使用JNI使用静态链接库.我搜索了示例,但找不到任何示例. 如何静态地将JNI库链接到我的Java应用程序? 解决方案 已更改了Java SE 8规范以支持静态链接,并且在JDK中实现了静态链接.在天然方法签名和数据类型对于静态和动态链接的方法相同.您可能必须在JDK Makefiles上砍掉它才能使其静态地链接您的库. 一个重要的差异是静态库的初始化方式.动态库是通过调用JNI_OnLoad函数来初始化的,并通过调用JNI_OnUnload来进行脱位.每个动态库可以具有自己的这些功能的版本.如果有多个静态链接的库,显然它们不能全部具有相同名称的功能.对于名为libname的静态库,负载/卸载功能为JNI_OnLoad_libname和JNI_OnUnload_libname. JNI_OnLoad_libname函数必须返回JNI_VERSION_1_8或更高的值.如果
0 2023-09-29
编程技术问答社区
我有2个非常相似的C语言函数被python和Java调用。我怎样才能把这两个库合并成一个可以从两种语言中调用的库?
基本上,我使用CTYPES和JNI使用CTYPES和JAVA从Python调用了C函数"加密"的2个实现.有人告诉我要乘坐用于Java和Python的两个动态库,并将它们合并到一个可以从两者中调用的静态库中.要澄清,这是使用JNI的JAVA的C函数实现: #include "jniTest.h" #include JNIEXPORT void JNICALL Java_jniTest_passBytes (JNIEnv *env, jclass cls, jbyteArray array) { unsigned char *buffer = (*env)->GetByteArrayElements(env, array, NULL); jsize size = (*env)->GetArrayLength(env,array); for(int i=0; i
0 2023-09-29
编程技术问答社区
静态库和JNI
我创建了一个标题文件和一个相应的.c文件,该文件中有一个我想与Java程序一起使用的功能.我使用Javah创建了JNI标头文件.我正在使用GCC来编译我的标题文件.如何将常规C对象文件与JNI静态库链接到使用C库的静态库?我正在使用GCC编译. 这是我要问的示例: lib.h lib.c JNITest.h JNITest.c (uses lib.h functions) 解决方案 您可能会尝试查看此
0 2023-09-29
编程技术问答社区
如何打包静态加载的JNI库?
我当前有一个Java应用程序,该应用程序正在在两个不同平台上的本机库中动态加载Windows和Linux.我有相同的库,针对这两个系统,一个library.dll和liblibrary. 我必须将此东西发送给客户,所以我已经将Intellij封装了.msi和.deb工件.现在,与其还将这些软件包与各自的动态库一起发送,并指示客户将它们放入其Windows/System32和/usr/lib/Directories中,而是希望这一切都可以照顾幕后.我想有某种方法可以将动态库包装到我的.msi或.deb中,并指示这些安装程序将库将库复制到正确的文件夹,但是我担心权限错误和类似的内容. 我已经读到,Java 1.8现在支持静态库,但是似乎缺乏关于您应该如何实现这一目标的文档.每个人都同意,您需要在库中公开两个新的电话,JNI_OnLoad_LibraryName和JNI_OnUnload_LibraryName,您只会与往常相同.但是,似乎没有人提及或至少给出有关如何与JVM一起打包静
在64位操作系统上将静态库(没有-fPIC)链接到共享库中
i在C ++中编写程序M,将从中共享库,然后将其使用JNI使用.我有第三方库(libexample.a),需要将其链接到共享库(libshared.so).问题是,我需要使用64位Centos和-fpic来创建共享的lib,但是第三方库未与-fpic一起编译. 直到建筑物我recive: /usr/bin/ld: /home/tom/Project/src/libexample.a(SomeObject.o): relocation R_X86_64_32 against 'someData' can not be used when making a shared object; recompile with -fPIC 在这种情况下是否可以制作共享库? (我没有libexample的源代码.A...) 是否有任何解决方法可以使其起作用?甚至在我必须编写其他应用程序时的想法. 我希望我的问题不会复制(或多或少),因为我花了很长时间来搜索可能性. 谢谢,贝兹
0 2023-09-29
编程技术问答社区
从Robovm项目中创建iOS静态库(JNI中的BAD_ACCESS)。
我有大量的Java代码(仅计算功能,没有UI),我想将其作为iOS中的静态库重复使用.我的方法是使用 robovm ,并遵循非正式的方式创建Robovm论坛中两篇文章中描述的静态库: 1个基本方法和试图完全按照所述的步骤遵循这些步骤,不幸的是,我在与脚本创建共享库后不幸地陷入了困境,并将XCode链接(.A)链接并成功地构建项目. 在运行时,我看到我的C ++桥代码被调用,但JNI用BAD_ACCESS呼叫库失败.例如,以下行崩溃: jclass myJavaClass = jniEnv->FindClass("com/test/robovm/bridge/MyJavaRoboCode"); 在此方法中: void callSomethingInJava(const char* arg) { // To call into java from your native app, use JNI Env* rvmEnv = rvmGetEnv();
0 2023-09-29
编程技术问答社区
如何在Android Studio 3.2中用CMake创建静态库(.a文件)?
现在,我创建了一个新项目,包括Android Studio 3.2中的C ++支持,它具有native-lib.cpp自然,CMakeLists.txt看起来像这样: add_library( # Sets the name of the library. native-lib # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/cpp/native-lib.cpp) 现在,如果我构建了这个项目,我可以在某些"调试"务件中找到libnative-lib.so,这没关系,但是我想要静态库IE .a文件. 更改共享 to static 不会生成这些文件,我还应该做什么? 除add_library()以外,CMAKE文档没有提及其他方法. 我搜索的每个文档都只谈论
0 2023-09-29
编程技术问答社区
编译安卓的C库,但没有找到符号
我试图为Android编译一个简单的C库,但是结果库不包含任何符号/对象!我正在使用nm命令检查库. 这是android.mk: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := my_lib_static LOCAL_MODULE_FILENAME := libmylib LOCAL_C_INCLUDES := $(LOCAL_PATH) LOCAL_SRC_FILES := File1.c File2.c include $(BUILD_SHARED_LIBRARY) # or include $(BUILD_STATIC_LIBRARY) 编辑: 创建了一个称为" OBJ"的子文件夹,它具有所有符号. 编辑: 这是gobjdump的输出: MyLibBot.o: file format elf32-littlemips gobjdump:
0 2023-09-29
编程技术问答社区
是否可以通过JNI将静态库链接到Java?
是否可以使用JNI构建Helloworld.lib并将其加载到Java应用程序中?或者它只是与共享库一起使用? 我找不到关于JNI文档的明确答案,没有提及"静态库". 解决方案 它需要是动态库.幸运的是,您可以从静态库构建动态库. 其他解决方案 Java 8支持静态链接的本机库 http://openjdk.java.net/jeps/jeps/178 其他解决方案 要在运行时加载库,必须是DLL(Windows).如果您有静态库(LIB),并且必须通过JNI使用它,则必须创建包装器DLL
0 2023-09-29
编程技术问答社区
从本地代码中调用另一个包的静态java方法
例如,假设在Android中,我需要调用静态方法android.os.SystemClock.elapsedRealtime(),该方法从本机代码的一部分返回了很长的.在mylib.c文件中,我有 JNIEXPORT jlong JNICALL Java_com_mpackage_MyClass_nativeMethod(JNIEnv *env, jobject obj){ jclass cls = (*env)->GetObjectClass(env, obj); jmethodID mid = (*env)->GetStaticMethodID(env, cls, "android.os.SystemClock.elapsedRealtime", "(V)J"); if (mid == 0) return 0L; return CallStaticLongMethod(cls, mid); } 在java MyClass.class中,我有
0 2023-09-28
编程技术问答社区
C++跳转到其他方法的执行
在我的C ++ JNi-Agent项目中,我正在实现一个函数,该函数将得到可变的参数,并将执行传递给其他函数: // address of theOriginalFunction public static void* originalfunc; void* interceptor(JNIEnv *env, jclass clazz, ...){ // add 4 to the function address to skip "push ebp / mov ebp esp" asm volatile("jmp *%0;"::"r" (originalfunc+4)); // will not get here anyway return NULL; } 上面的功能只需跳到: JNIEXPORT void JNICALL Java_main_Main_theOriginalFunction(JNIEnv *env, jclass cl
0 2023-09-28
编程技术问答社区
libcurl CURLE_SSL_CACERT_BADFILE在安卓上的错误
因此,我正在尝试将libcurl与JNI一起使用,但它返回curle_ssl_cacert_badfile错误.这是我的代码. jni侧: static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) { ((string*)userp)->append((char*)contents, size * nmemb); return size * nmemb; } //jList is an array containing the certificate. Java_packageName_MainActivity_Test(JNIEnv *env, jobject thiz, jobject jList) { vector certificatesPinning; // Convert
0 2023-09-27
编程技术问答社区
Android JNI,C++代码是否有办法直接读取应用程序的sqlite数据库?
我正在使用JNI处理具有Java组件和C ++组件的Android应用程序. C ++组件在其他平台上使用. ,如果C ++组件可以查询现有的SQLite数据库(通过SQLite C API),这将使我的生活更加轻松,而无需将其弹出呼叫到Java端. 我知道这是一个漫长的镜头,有人尝试过吗? 解决方案 否,NDK仅提供有限的API.唯一的官方支持区域是: libc(c库)标题 libm(数学库)标题 JNI接口标头 libz(zlib压缩)标头 liblog(Android Logging)标题 OpenGL ES 1.1和OpenGL ES 2.0(3D图形库)标题 libjnigraphics(像素缓冲区访问)标题(适用于Android 2.2和 上面). C ++支持的最小标题 来自 ndk docs . 其他解决方案 如果您不需要从Java访问数据库,那么就Android而言,它只是您拥有权利的目录中的文件.通过平台的libs
0 2023-09-22
编程技术问答社区
java.lang.UnsatisfiedLinkError in jsqlite.Database.internal_init in Android Spatialite
我是针对Android开发和使用空间的新手 java.lang.unsatisfiedlinkerror:未针对void jsqlite.database.internal_init()找到实施(尝试JAVA_JSQLITE_DABASE_INTERN_INTERN_INIT_1INIT和JAVA_JSQLITE_JSQLITE_DABASE_DABASE_DABASE_INTERN_INTERN_INENTER_INTERNE_1INIT__) 在jsqlite.database.internal_init(本机方法) 在jsqlite.database.(database.java:25) 此崩溃报告来自Android 6.0的Nexus 5(Hammerhead),但已在Xoom上使用Android 4.1和其他一些未知设备进行了报道.我认为这可能与这些问题中提到的NDK版本有关: 添加" .so"库"一个> 位. (尽管这是针对sqlite4java) 除此
2 2023-09-21
编程技术问答社区
SQLite3.Exception: 数据库磁盘镜像格式错误
Mates I M在使用ndk 使用SQLITE 3本机C库(JNI)时获取此错误消息 请建议我在哪里做错了 01-29 11:04:19.532: E/Error(2023): SQLite3.Exception: database disk image is malformed 01-29 11:04:19.544: E/dalvikvm(2023): JNI ERROR (app bug): accessed stale local reference 0x7f00001d (index 7 in a table of size 7) 01-29 11:04:19.544: E/dalvikvm(2023): VM aborting 01-29 11:04:19.544: A/libc(2023): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 2023 (abdkosh.android) 这是我的代
0 2023-09-21
编程技术问答社区
UnsatisfiedLinkError (未找到本地方法)
有一个代码块,在Android 4.1.2上工作正常,但在4.0.3上不正常,碰撞日志为4.0.3 我变得不满意的linkerror例外 请指导我谢谢 02-22 12:57:09.319: D/dalvikvm(1312): Trying to load lib /data/data/com.kosh.android/lib/libsqliteX.so 0x41056f48 02-22 12:57:09.319: D/dalvikvm(1312): Added shared lib /data/data/com.kosh.android/lib/libsqliteX.so 0x41056f48 02-22 12:58:02.060: W/dalvikvm(1312): No implementation found for native Lcom/shabdkosh/android/sqlite/CursorWindow;.native_init (Z)V 02-22
0 2023-09-21
编程技术问答社区