是否可以编写一个运行本机,平台相关代码的扩展?我是一个扩展新手(什么短语!):),请你指点我这个主题的好材料?(向Google提供的好关键字就足够了)
编辑:我开始查看Gecko SDK,这是一个相当大的主题,我不确定这是我想要的.
我很满意一本友好的手册(这不是一个原始参考,而是一些关于如何使用XPCOM进行扩展的教程(如果是这样的话).好的关键词仍然很受欢迎.
JPA(createNativeQuery)中的本机查询是否支持缓存?
我正在填充我自己的数据传输对象,因为sql查询连接了几个表,并且只从它们中获取几个列.
问候
我有一个由两部分组成的库 - 一个.net程序集,P/Invokes到本地第三方dll.在桌面模式下,这很好用:但是,当从Metro风格的应用程序引用程序集并运行它时,它会System.DllNotFoundException在P/Invoke上抛出一个抱怨"无法加载DLL'库':无法找到指定的模块. "
本机dll不执行任何特殊操作,但只创建到服务器的外部TCP/IP连接.系统无法知道这一点,而是原生dll可以做任何事情.这就是我怀疑可能无法做到这一点的原因.
有关Metro风格的应用程序在msdn上提到了一些dll搜索顺序,暗示可以加载本机dll吗?
另外我在msdn上发现了这个关于加载"库"的链接,并在清单文件中提到了PackageDependency,但对我来说,仍然不清楚如何以可以P/Invoke它的方式将一个本机dll添加到包中.
我使用C#的原生EXE是什么样的,我想编译一个基本的EXE,它将在不需要.net框架的情况下运行.我听说ngen.exe可以任何人给我ngen.exe的例子或任何更好的方法.此外,我将为生成的应用程序生成运行时如何将其放入应用程序中,以便使用我的语言的任何人都可以使用其功能.
1)在iOS和Android Native库可用的情况下,为了使用库来开发跨平台应用程序,需要采取哪些适当,有效和简单的步骤?绑定Android库还是iOS?如果我们绑定Android本机库,我们是否能够在Xamarin.iOS应用程序中使用此绑定库,反之亦然?
2)如果有可用的C++库,是否可以使用该库来开发跨平台应用程序?
提前致谢!
(只是Xamarin的初学者,如果问题似乎不合适,请找借口)
问题
我无法加载并将已编译的c类中的方法调用到leiningen项目中.我的基本方法是加载一个Java类JavaWrapper.java,它使用JNI调用本机代码中的一些本机方法,wrapper.o然后通过这个java包装类调用方法.
我想有一个classLoader问题,加载一个java类,它从clojure项目加载本机代码,但鉴于我似乎无法直接获取clojure代码在库路径上找到wrapper.o,我不确定如何处理这个.
列宁项目文件
(defproject lein-native-test "0.1.0-SNAPSHOT"
...
:java-source-paths ["java-path"]
:jvm-opts ["-Djava.library.path=.:./native:/absolute/path/to/native"] ;;not sure what format it wants
)
Run Code Online (Sandbox Code Playgroud)
使用main方法的clojure文件
我尝试使用四种方法稍微修改它们,所有这些都包含在下面的代码中以及注释中的相应错误.
(ns lein-native-test.core
(:import (com.test JavaWrapper)))
(def -main []
;;four things I've tried and their errors
(clojure.lang.RT.load "/abs/path/to/wrapper.o") ;;could not find file /abs/path/wrapper.o_init.class or wrapper.o.clj
(clojure.lang.RT.loadLibrary "wrapper.o") ;;UnsatisfiedLinkError no wrapper.o in java library path
(JavaWrapper/load "/abs/path/to/wrapper.o") ;;UnsatisfiedLinkError com.test.JavaWrapper.setup()
(assembly-load "/abs/path/to/wrapper.o") ;;unable to resolvesymbol: assembly-load
)
Run Code Online (Sandbox Code Playgroud)
使用JNI,JavaWrapper.java的本机方法的Java代码
public class JavaWrapper{
public native void setup();
public static void load(String lib){ System.load(lib);}
} …Run Code Online (Sandbox Code Playgroud) 使用NDK 10版本,我曾经用于ndk-build编译许多不同ABI和多个API级别的独立二进制文件.这些二进制文件将包含在一个应用程序中.但是,我在本文所述的新开发机器上安装了NDK .这导致ndk-bundle我的Android SDK目录中有一个文件夹.我曾经从命令行编译代码,然后将二进制文件复制到我的Android Studio项目的资源中,但我无法弄清楚如何使用NDK 13这样做,所以我尝试按照教程包含我的本机代码Android Studio项目.但是,几乎所有最近的指令都假设一个人想要构建一个库,而不是一个独立的二进制文件,所以我没有走得太远.
如果我弄清楚如何让它工作,我会切换到CMake.我的本机项目具有以下(简化)结构:
本地人
Android.mk
LOCAL_PATH := $(call my-dir)/my_tool/src
include $(CLEAR_VARS)
LOCAL_MODULE := my_tool
LOCAL_SRC_FILES := main.c
include $(BUILD_EXECUTABLE)
Run Code Online (Sandbox Code Playgroud)Application.mk
APP_ABI := all
APP_PLATFORM := android-21
Run Code Online (Sandbox Code Playgroud)my_tool
如何在Windows 10开发机器上使用Android Studio或NDK从命令行编译?
编辑:
我在build.gradle中使用它:
externalNativeBuild {
ndkBuild {
path "../native/Android.mk"
}
}
Run Code Online (Sandbox Code Playgroud)
Gradle创建了一个.externalNativeBuild包含构建配置的目录,但我无法找到如何实际构建本机代码.运行gradle时不会创建二进制文件.
我找不到有关gradle配置的任何信息ndk-build.
我试图用一些预编译的本机库构建android应用程序: liba.so和libb.so.1.2.3
库放在jniLibs子目录中.构建APK文件后,只包含liba.so,但不包含libb.so.1.2.3.
结果是可预测的.应用程序在开始时崩溃.
如何处理构建脚本以将jniLibs中的所有文件包含到APK中?
我正在尝试在android studio项目中使用opencv本机库。对于函数knnMatch的未定义引用,我得到一个错误。
我已将openCVLibrary添加到我的项目中,并成功使用了其他openCV功能。
更新:添加我的编译文件
我的应用程序build.gradle:
apply plugin: 'com.android.application'
//
android {
compileSdkVersion 27
buildToolsVersion '27.0.3'
//
defaultConfig {
minSdkVersion 21
targetSdkVersion 27
...
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang" , "-DANDROID_STL=c++_static","-DCMAKE_BUILD_TYPE=Release", "-DANDROID_CPP_FEATURES=rtti exceptions"
cppFlags "-D__STDC_FORMAT_MACROS" , '-O3','-fopenmp','-fsigned-char', "-std=c++14", "-frtti", "-fexceptions", "-mfloat-abi=softfp", "-Wall"
}
ndk {
abiFilters 'arm64-v8a'
}
}
}
//
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
...
}
//
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
implementation project(':openCVLibrary340') //Module
}
Run Code Online (Sandbox Code Playgroud)
我的CMakeList.txt:
cmake_minimum_required(VERSION 3.4.1)
# …Run Code Online (Sandbox Code Playgroud) Java固有函数在很多地方都提到过(例如here)。我的理解是,这些是使用特殊本机代码处理的方法。这似乎类似于JNI方法,它也是本机代码块。
有什么不同?