标签: java-native-interface

Android霓虹内在函数中"加法"和"成对加法"之间的区别?

我在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.为什么这两种方法?

java-native-interface android neon

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

JNI获取上下文

我正在为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)

非常感谢您的帮助!

c++ java java-native-interface qt android

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

当CallVoidMethod到java函数处理时JNI崩溃

当我的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-native-interface android android-ndk

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

不支持的JNI版本0xFFFFFFFF

从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)

这是我正在使用的新库,其他工作正常.

java java-native-interface applet

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

如何诊断JNI内存损坏问题?

我已经调试了这个问题几天,没有任何运气.我必须遗漏一些相当明显的东西.我正在运行与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)

c java-native-interface

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

JNI:用C代码读取文本文件并返回sdk

我试图创建一个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-native-interface android-ndk

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

用于LMDB的Java绑定,需要帮助刷新LMDB JNI

我们在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)

java-native-interface lmdb

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

进程和多个jvm

这可能是一个微不足道的问题,我只想确认我对流程和多个jvms的理解.

我创建了一个C++ DLL程序,通过JNI调用我的java jar文件.然后我在其他C++程序中调用此C++ DLL.据我所知,在我称之为dll的任何特定程序中,只允许一个jvm.在我的项目,一个C++程序调用开头的dll一次,节目的最后,和DLL将创建JVM时,DLL被称为第一次和附加线程JVM时,它被称为第二次.

我的问题是我将有许多不同的C++程序调用这个DLL,所以它应该创建多个jvms?这是每个进程创建一个jvm,对吧?或者他们仍被视为线程?

谢谢!

c++ java java-native-interface

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

Jni FindClass返回NULL

我在头文件中得到了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)

c++ java java-native-interface android

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

有什么方法可以转储/查看jni globalref池?

我最近正在做很多JNI工作,并且想监视(或至少转储)jni globalref池的内容。Google尚未提供任何帮助。

我注意到,如果您确实触发了globalref-pool耗尽,它会列出池中的前10个项目,因此我希望可以通过某种方法来解决。

java java-native-interface android android-ndk

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

标签 统计

java-native-interface ×10

android ×5

java ×5

android-ndk ×3

c++ ×3

applet ×1

c ×1

lmdb ×1

neon ×1

qt ×1