我有一个Java程序,Maven管理它的依赖项.其中一个依赖项是另一个程序的JNI包装器.Maven负责处理相关JAR文件的引用,但我自己还在搞乱DLL文件.
有没有一个让Maven处理DLL的好方法?理想情况下,我希望将DLL加载到我们的本地存储库中,如JAR文件.
我正在Android上实现一个人脸跟踪器,作为一个文献研究,想要确定Android的FaceDetector的基础技术.
简单地说:我想了解android.media.FaceDetector分类器的工作原理.
一个简短的谷歌搜索没有提供任何信息,所以我想我会看看代码.
通过查看Java源代码,FaceDetector.java没有太多需要学习的内容:FaceDetector只是提供图像尺寸和面数的类,然后返回一个面数组.
Android源代码包含此类的JNI代码.我跟着函数调用,在那里,简化为基本要素,我学到了:
FaceFinder.c:75bbs_MemSeg_alloc返回一个btk_HFaceFinder对象(其中包含实际查找面的函数),基本上将其复制到initialize()()中初始化hsdkA->contextE.memTblE.espArrE的原始btk_HSDK对象的数组中FaceDetector_jni.cpp:145.btk_SDK_create()btk_HSDK,但我无处可寻找具体的实例,sdk->contextE.memTblE.espArrE[0]其中包含了魔法.我已经发现,是一个小线索:JNI代码引用FFTEm库,我无法找到的源代码.然而,从它的外观来看,FFT是快速傅立叶变换,它可能与预训练的神经网络一起使用.我能找到的唯一符合这一理论的文献是Ben-Yacoub等人的论文.
我甚至不知道自己是否走上了正确的道路,所以任何建议都无疑会有所帮助.
编辑:我为任何可以提供任何见解的人添加了+100赏金.
这是场景:
我需要编写一个Android应用程序来创建一个带有蓝牙适配器的PC的RFCOMM插槽(我也要编写服务器).
我的要求是用户不必手动配对设备.
实际上,有一个大黑客,我正在使用createInsecureRfcommSocket.
一个小场景:我有一个Android应用程序,它与一个打开了RFCOMM套接字的Linux盒子交换信息.我可以在设备上手动设置PIN(硬编码是一种选择)
我正在寻找不同的道路:
编写JNI包装器
如已完成在这里的最大凯勒曼,我可以写一个JNI层,使所有配对阶段.这应该是一个不错的选择,但是有一个问题:
NDK 4b不提供libbluetooth库,因此-lbluetooth失败,以及NDK v.3.
选项:
使用API公开的内容
任何人都知道如何使用createRfcommSocketToServiceRecord并让用户不要手动配对设备?可能吗?我应该怎么写服务器?
我不知道的东西
也许(肯定!)有一些我不知道的东西.也许我可以用别的东西?不是RFCOMM?SDP?
也许我可以手动配对Android API?
我希望已经足够清楚,如果不是只是问.再次,因为这不是第一次,我在你的手中:)
感谢所有支持人员!
我有一个字符串数组一样{"myname","yourname","hisname"},我想这个数组发送到ç使用JNI.我找不到任何明确的解决方案.我试图把这个字符串作为一个chararray但没有成功.
有没有办法做到这一点?
我正在尝试使用Java升级我的应用程序,只有在具有特定名称的进程窗口处于活动状态时才能工作.我发现使用JNI可以实现这一点,但我不知道究竟是怎么做到的.我找不到任何可以解释它的描述或例子.我的问题是 - 如何在Windows中获取当前活动窗口的进程名称(通过JNI或其他任何方式 - 我接受任何其他解决方案)?
我有Java应用程序调用本机C++/C代码.C++/C代码需要回调到Java.你能举几个例子来说明这个吗?
#include <stdio.h>
#include <jni.h>
JNIEnv* create_vm() {
JavaVM* jvm;
JNIEnv* env;
JavaVMInitArgs args;
JavaVMOption options[1];
/* There is a new JNI_VERSION_1_4, but it doesn't add anything for the purposes of our example. */
args.version = JNI_VERSION_1_2;
args.nOptions = 1;
options[0].optionString = "-Djava.class.path=/home/test/workspace/pankajs/"
"jikes/JikesRVMia32-linuxproduction/target/tests/stress/prototype/basic/classes";
args.options = options;
args.ignoreUnrecognized = JNI_FALSE;
JNI_CreateJavaVM(&jvm, (void **)&env, &args);
return env;
}
void invoke_class(JNIEnv* env) {
jclass helloWorldClass;
jmethodID mainMethod;
jobjectArray applicationArgs;
jstring applicationArg0;
helloWorldClass = (*env)->FindClass(env, "/test/org/jikesrvm/basic/core/bytecode/TestSwitch");
mainMethod = (*env)->GetStaticMethodID(env, helloWorldClass, "main", "([Ljava/lang/String;)V");
applicationArgs = …Run Code Online (Sandbox Code Playgroud) 我们有一个c/asm使用GPU(OpenCL)的本机应用程序,用于encrypt/decrypt使用特定方法的大数据,它只是工作完美,没问题.项目的一部分(Web和分发)一直在开发JEE,我们只需要调用本机应用程序/库.
我们试图使用Processclass 将其称为分离外部进程.问题是我们无法控制应用程序(事件,处理程序,线程等).我们还尝试将C代码切换为Java代码,但性能已经消失.除了将本机代码作为进程运行之外,我正在考虑JNA和JNI,但是有一些问题.
问题:
ByteBuffer#allocateDirect()JNI和JNA中的直接(非托管)内存[Java()] 交换数据?我们在Redhat Linux6 x64上有两个AMD W7000集群设备.
我正在使用Rust 1.0 beta并且能够创建一个小例子来调用从Java编写的Rust函数.我只是使用rustc在mylib.rs中编译以下Rust代码,在Windows上生成mylib.dll:
#![crate_type = "dylib"]
use std::any::Any;
#[no_mangle]
pub extern fn Java_tests_Test_hello(env: *const Any, jclass: *const Any) {
println!("hello from rust");
}
#[no_mangle]
pub extern fn Java_tests_Test_sum(env: *const Any, jclass: *const Any, a: i32, b: i32) -> i32 {
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
然后我可以从Java类test.Test调用这些函数:
package tests;
import java.io.File;
public class Test {
public static native void hello();
public static native int sum(int a, int b);
public static void main(String[] args) {
File f = new File("mylib.dll");
System.load(f.getAbsolutePath());
Test.hello(); …Run Code Online (Sandbox Code Playgroud) 当我尝试将项目导入我的工作区时,它显示错误
[2013-03-17 16:14:15 - 无法启动cygpath.是Cygwin的路径吗?] java.io.IOException:无法运行程序"cygpath":CreateProcess error = 2,系统找不到指定的文件
这个项目包含jni库,它是一个基于ndk的项目.为什么会发生这个错误我不能将这个项目导入我的系统.