我在Android JNI上使用Neon实现了一个算法.当我想要将向量添加到一起时,我注意到有两种类型的方法,我无法发现差异.
// pairwise addition
int8x8_t vpadd_s8(int8x8_t a, int8x8_t b); // VPADD.I8 d0,d0,d0
// addition
int8x8_t vadd_s8(int8x8_t a, int8x8_t b); // VADD.I8 d0,d0,d0
Run Code Online (Sandbox Code Playgroud)
第二个做你期望的.它取a中的ith int8并将其添加到b中的ith int8.为什么这两种方法?
我正在为JNI使用一些示例代码.
我有一个Java类,
public String getArtists(Context context)
...
Run Code Online (Sandbox Code Playgroud)
但是,这个编码如下的c ++接口只返回一个空指针
s_getArtistsGetArtistsMethodID = env->GetMethodID(s_getArtistsClassID, "getArtists", "(Landroid/content/Context;)V");
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?下面的代码按预期工作,所以我假设它与context参数有关.
s_getArtistsConstructorMethodID = env->GetMethodID(s_getArtistsClassID, "<init>", "()V");
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助!
当我的UDP程序调用我的JNI函数CallVoidMethod时,我的程序崩溃了.我无法从logcat解密问题.任何帮助将不胜感激.
我的代码片段:
JNI功能:
jmethodID constructID, methodID;
JNIEnv* env;
jclass clazz;
JavaVM *g_jm;
int downLoad_speed_test_start(JNIEnv * envl, jobject thiz, int serverport) {
jobject obj;
struct sockaddr_in servAddr, clientAddr;
int slen = sizeof(clientAddr);
char buf[512];
int socket_ovdp;
if ((socket_ovdp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
__android_log_print(ANDROID_LOG_DEBUG, "MY_TAG",
"\nSocket() unsuccessful\n");
else
__android_log_print(ANDROID_LOG_DEBUG, "MY_TAG",
"\nServer: Socket() successful\n");
bzero(&servAddr, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(serverport);
inet_addr("127.0.0.1");
clazz=env->GetObjectClass(thiz);
constructID = env->GetMethodID(clazz, "<init>","()V");
methodID = env->GetMethodID(clazz,"jniCall","(I)V");
obj=env->NewObject(clazz,constructID);
JavaVM *jm;
env->GetJavaVM(&jm);
if (bind(socket_ovdp, (struct sockaddr*)&servAddr, sizeof(servAddr)) == …Run Code Online (Sandbox Code Playgroud) 从java代码使用本机DLL时有没有遇到过这个错误?它是JNI库的版本吗?还是一个未解决的依赖?
错误:
Caused by: java.lang.UnsatisfiedLinkError: unsupported JNI version 0xFFFFFFFF required by C:\jnwasapi.dll
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary1(Unknown Source)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的新库,其他工作正常.
我已经调试了这个问题几天,没有任何运气.我必须遗漏一些相当明显的东西.我正在运行与JavaFX 2.2打包工具打包在一起的Swing应用程序,它通过JNI连接到C .dll.
一切都很好,直到我想添加一个函数从C调用回Java.当我这样做时,我开始遇到内存损坏问题.这是错误,然后是我的新JNI代码:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x7c82c912, pid=7424, tid=4828
#
# JRE version: Java(TM) SE Runtime Environment (7.0_40-b43) (build 1.7.0_40-b43)
# Java VM: Java HotSpot(TM) Client VM (24.0-b56 interpreted mode windows-x86 )
# Problematic frame:
# C [ntdll.dll+0x2c912]
#
# Core dump written.
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
#
--------------- T H R E …Run Code Online (Sandbox Code Playgroud) 我试图创建一个Android应用程序,使用NDK从文本文件中读取文本.我的C代码将字符串读入变量并将字符串变量返回到java代码.但是当我运行Android应用程序时,TextView中显示的字符串显示为像@后跟一些矩形的符号.从JNI返回字符串的格式是什么?检查下面的代码.我可以在没有任何其他权限的情况下读取系统文件吗?printf()语句会做什么?
Java代码:
package com.example.openfile;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener{
public native String ndkopenfile();
static{
System.loadLibrary("mylib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//TextView textView1 = new TextView(this);
//textView1.setText(ndkopenfile());
Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} …Run Code Online (Sandbox Code Playgroud) 我们在java应用程序中使用LMDB.可用的Java绑定是1年.我想刷新LMDBJNI https://github.com/chirino/lmdbjni
但是,项目所有者没有提供有关如何构建项目的任何说明.所以我不能只是克隆他的git存储库,并删除新版本的LMDB(https://git.gitorious.org/mdb/mdb.git)c和h文件,并重建它
似乎在LMDB下面JNI正在使用hawkjni,但这就是我所得到的.
这些是我尝试的步骤
a)git clone https://github.com/chirino/lmdbjni.git b)cd lmdbjni; mvn install它成功完成,但生成的JAR没有编译实际的lmdb库.所以我的测试程序失败了
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.UnsatisfiedLinkError: Could not load library. Reasons: [no lmdbjni64-99-vspmaster-SNAPSHOT in java.library.path, no lmdbjni-99-vspmaster-SNAPSHOT in java.library.path, no lmdbjni in java.library.path]
at org.fusesource.hawtjni.runtime.Library.doLoad(Library.java:182)
at org.fusesource.hawtjni.runtime.Library.load(Library.java:140)
at org.fusesource.lmdbjni.JNI.<clinit>(JNI.java:41)
at org.fusesource.lmdbjni.Env.create(Env.java:42)
at org.fusesource.lmdbjni.Env.<init>(Env.java:36)
at com.db.locrefdcache.App.main(App.java:27)
... 6 more
Run Code Online (Sandbox Code Playgroud)
c)然后我想,我可能不仅能够为lmdbjni运行mvn install,而是需要显式构建它的64位Linux子系统
所以我做了cd lmdbjni/lmdbjni-linux64 mvn install
在那里,我可以看到它试图运行配置脚本(由autotools生成),但我得到了
...
[INFO] checking lmdb.h usability... no
[INFO] checking lmdb.h presence... …Run Code Online (Sandbox Code Playgroud) 这可能是一个微不足道的问题,我只想确认我对流程和多个jvms的理解.
我创建了一个C++ DLL程序,通过JNI调用我的java jar文件.然后我在其他C++程序中调用此C++ DLL.据我所知,在我称之为dll的任何特定程序中,只允许一个jvm.在我的项目,一个C++程序调用开头的dll一次,节目的最后,和DLL将创建JVM时,DLL被称为第一次和附加线程JVM时,它被称为第二次.
我的问题是我将有许多不同的C++程序调用这个DLL,所以它应该创建多个jvms?这是每个进程创建一个jvm,对吧?或者他们仍被视为线程?
谢谢!
我在头文件中得到了c ++结构,
struct StatusLine
{
static jclass Class; // Lorg/apache/http/StatusLine;
static jmethodID GetStatusCode; // ()I
};
struct ByteArrayOutputStream
{
static jclass Class; // Ljava/io/ByteArrayOutputStream;
static jmethodID Constructor; // ()V
static jmethodID Close; // ()V
static jmethodID ToByteArray; // ()[B
};
struct HttpEntity
{
static jclass Class; // Lorg/apache/http/HttpEntity;
static jmethodID WriteTo; // (Ljava/io/OutputStream;)V
static jmethodID GetContent; // ()Ljava/io/InputStream;
};
Run Code Online (Sandbox Code Playgroud)
和cpp文件是
#define JAVA_STATUS_LINE_CLASS "org/apache/http/StatusLine"
#define JAVA_HTTP_ENTITY_CLASS "org/apache/http/HttpEntity"
#define JAVA_BYTE_ARRAY_OUTPUT_STREAM_CLASS "java/io/ByteArrayOutputStream"
jclass StatusLine::Class = 0;
jmethodID StatusLine::GetStatusCode = 0;
jclass ByteArrayOutputStream::Class = …Run Code Online (Sandbox Code Playgroud) 我最近正在做很多JNI工作,并且想监视(或至少转储)jni globalref池的内容。Google尚未提供任何帮助。
我注意到,如果您确实触发了globalref-pool耗尽,它会列出池中的前10个项目,因此我希望可以通过某种方法来解决。