标签: java-native-interface

使用 JNI 从 Java 调用 C# 方法

我尝试按照我在这里找到的示例进行操作,但无法使其正常工作。这是我的 Java 类

package jniTester;
public class JNITester {
    static {
        System.load("D:\\\\VisualStudio_Cpp_2017\\SkriptumTeil5\\Debug\\HelloWorldJNI.dll");
    }

    public static native String welcome(String name);
}
Run Code Online (Sandbox Code Playgroud)

由此我用 javah 创建了 jniTester.h 文件

这是我的 C# 课程

namespace HelloWorldJNI
{

    public static class HelloWorldJNI
    {
        public static String Welcome(String name)
        {
            return "Hello " + name + "! This is your C# buddy.";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

由此我创建了 HelloWorldJNI.netmodule

这是我的cpp课程

#include "stdafx.h"
#include <jni.h>
#include <string>
#include "jniTester.h"
#using "D:\VisualStudio_C#_2017\SkriptumTeil5\HelloWorldJNI\HelloWorldJNI.netmodule"


using namespace std;

JNIEXPORT jstring JNICALL Java_jniTester_JNITester_welcome(JNIEnv *env, jclass thisclass, …
Run Code Online (Sandbox Code Playgroud)

c# java java-native-interface

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

了解 Jeprofile 输出

我能够根据jemalloc 帖子中的描述生成 Jeprofile 输出,如下所示

请找到 jemalloc 输出和图表。

> Using local file /bin/java. Using local file jeprof.57473.0.f.heap.
> Total: 79372091 B 78084060  98.4%  98.4% 78084060  98.4%
> je_prof_backtrace  1288031   1.6% 100.0%  1474342   1.9%
> Java_java_util_zip_ZipFile_getZipMessage
>        0   0.0% 100.0%  6889972   8.7% 0x00007f3d5ebac3e6
>        0   0.0% 100.0%   270421   0.3% 0x00007f3d5ebb8a79
>        0   0.0% 100.0%   727762   0.9% 0x00007f3d5ebb8a87
>        0   0.0% 100.0%   589239   0.7% 0x00007f3d5ebb9ab2
>        0   0.0% 100.0%   854269   1.1% 0x00007f3d5ebb9ac0
>        0   0.0% 100.0%   270421   0.3% 0x00007f3d5ebb9cb7
>        0   0.0% …
Run Code Online (Sandbox Code Playgroud)

java java-native-interface jvm memory-leaks jemalloc

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

如何防止 C++ 中的模板类型扩展?

我编写了以下使用成员指针函数的类:

#include <stdlib.h>
#include <vector>

template<class Type>
class PrimitiveAccessor {
    public :
        PrimitiveAccessor(
            JNIEnv* env, const char name[], const char ctorSig[],
            Type (JNIEnv::*callTypeMethodFunction) (jobject, jmethodID)
        ) {
            this->env = env;
            this->type = (jclass)env->NewGlobalRef(env->FindClass(name));
            this->callTypeMethodFunction = callTypeMethodFunction;
        }
        ~PrimitiveAccessor(){
            env->DeleteGlobalRef(this->type);
        }

    private:
        JNIEnv* env;
        jclass type;
        jmethodID constructorId;
        jmethodID callTypeMethodId;
        Type (JNIEnv::*callTypeMethodFunction) (jobject, jmethodID);
};

class Environment {
    public:
        Environment(JNIEnv* env) {
            this->env = env;
            this->init();
        }
        ~Environment(){
            this->env = 0;
            delete(this->jintAccessor);
            this->jintAccessor = 0;
        }
    private:
        JNIEnv* env;
        PrimitiveAccessor<jint>* jintAccessor; …
Run Code Online (Sandbox Code Playgroud)

c++ java-native-interface templates template-classes

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

Eclipse错误:无法加载JNI共享库"C:\ Program Files(x86)\ Java\jre6\bin\client\jvm.dll

可能重复:
无法加载JNI共享库(JDK)

我已经下载了新的经典eclipse 64位我也改变了eclipse.ini和android jdk工具也安装但仍然低于错误.无法加载JNI共享库"C:\ Program Files(x86)\ Java\jre6\bin\client\jvm.dll如何解决问题?

请帮我.

java eclipse java-native-interface android

-1
推荐指数
1
解决办法
2万
查看次数

应用程序崩溃时将minifyEnabled设置为true

我正在使用greendao + sqlcipher并helper.getEncryptedWritableDb("sdfbdfsjkdjkf"); 使用proguard 创建加密数据库并添加了规则

### greenDAO 3
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties

# If you do not use SQLCipher:
-dontwarn org.greenrobot.greendao.database.**
# If you do not use RxJava:
-dontwarn rx.**

### greenDAO 2
-keepclassmembers class * extends de.greenrobot.dao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties




#######################################################################






-keep public class net.sqlcipher.** {
    *;
}

-keep public class net.sqlcipher.database.** {
    *;
}
Run Code Online (Sandbox Code Playgroud)

我将minifyEnabled设置为true的那一刻.我的应用程序在安装后启动时崩溃.

debug {


            shrinkResources false
            minifyEnabled false …
Run Code Online (Sandbox Code Playgroud)

java-native-interface android sqlcipher greendao android-proguard

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

JNI Java Wrapper:如何传递 byte[] 参数

我需要使用 JNI 从 C++ 调用 Java API。我试图通过一个byte*如下:

爪哇

void OperateData(byte[] data, int dataLength)
{
   //Some Implementation
}
Run Code Online (Sandbox Code Playgroud)

C++

void OperateData(byte* data, int dataLength)
{
    JavaMethod* methodObj = getMethod(_T("OperateData"));
    JNIEnv* jniEnv = JvmManager::GetInstance()->GetJNIEnv();
    jobject jBuffer = jniEnv->CallObjectMethod(m_javaObject->getJObject(), methodObj->getJMethodID(), (jobject)data, (jint)dataLength);
}
Run Code Online (Sandbox Code Playgroud)

这是行不通的。它正在抛出异常。你能告诉我我做错了什么吗?

更新:我根据建议修改了 C++ 代码,如下所示。我仍然有同样的问题。还有什么问题吗?

void OperateData(byte* data, int dataLength)
{
    JavaMethod* methodObj = getMethod(_T("OperateData"));
    JNIEnv* jniEnv = JvmManager::GetInstance()->GetJNIEnv();
    jbyteArray jBuff = jniEnv->NewByteArray(dataLength);
    jniEnv->SetByteArrayRegion(jBuff, 0, dataLength, (jbyte*)data);
    jobject jBuffer = jniEnv->CallObjectMethod(m_javaObject->getJObject(), methodObj->getJMethodID(), jBuff, (jint)dataLength);
    jniEnv->ReleaseByteArrayElements(jBuff,(jbyte*)data, 0);
}
Run Code Online (Sandbox Code Playgroud)

c++ java java-native-interface

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

我可以从静态 JNI 字段获取数据的内存地址吗?

我可以从静态 JNI 字段获取数据的内存地址吗?

比如我有2种情况:

第一的:

jclass clazz = ...;
jfieldID staticFiled = ...; // static field on java object
uintptr_t *staticFiledPtr = ((uint64_t) staticFiled); // get field ptr

jboolean *boolPtr = *magic code with static field*;
*boolPtr = true;
Run Code Online (Sandbox Code Playgroud)

第二:

jclass clazz = ...;
jfieldID staticFiled = ...; // static field on java object
uintptr_t *staticFiledPtr = ((uint64_t) staticFiled); // get field ptr

jobject *objectPtr = *magic code with static field*;
jobject object = *objectPtr;
Run Code Online (Sandbox Code Playgroud)

这些例子非常简单。我只想获取静态字段数据的内存地址,而不使用 GetStaticObjectField 等。这可能吗?

c++ java java-native-interface field memory-address

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

可以从Java applet调用C++代码吗?

我很好奇我是否能做到这一点.可以从在浏览器中运行的Java小程序调用在本地主机上编译和加载的C++代码吗?

c++ java browser java-native-interface applet

-2
推荐指数
1
解决办法
315
查看次数

如何在j中将jcharArray转换为char []

我有一个jcharArray通过Java传递到C程序,我需要知道如何在C程序中使用该数组.如何将我的jcharArray位转换为可以使用的东西(char bits[])?

我尝试使用JNI编写此代码

JNIEXPORT jint JNICALL Java_ex_NistStatisticalTestSuite_frequency
  (JNIEnv *env, jclass cls, jcharArray bits, jint jn)
{

    printf("running frequency test");

    int     i;
    double  f, s_obs, p_value, sum, sqrt2 = 1.41421356237309504880;
    int n=jn;
    char deletethis=(char)bits[0];
    sum = 0.0;
    for ( i=0; i<n; i++ )
        sum += 2*1-1;
    s_obs = fabs(sum)/sqrt(n);
    f = s_obs/sqrt2;
    p_value = erfc(f);

    return (jint)p_value;

}
Run Code Online (Sandbox Code Playgroud)

但它无法编译,说:

frequency.c:19:2: error: invalid use of undefined type ‘struct _jobject’
  char deletethis=(char)bits[0];
  ^~~~
frequency.c:19:28: error: dereferencing pointer …
Run Code Online (Sandbox Code Playgroud)

c java java-native-interface ffi

-3
推荐指数
1
解决办法
1766
查看次数