我尝试按照我在这里找到的示例进行操作,但无法使其正常工作。这是我的 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) 我能够根据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) 我编写了以下使用成员指针函数的类:
#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) 可能重复:
无法加载JNI共享库(JDK)
我已经下载了新的经典eclipse 64位我也改变了eclipse.ini和android jdk工具也安装但仍然低于错误.无法加载JNI共享库"C:\ Program Files(x86)\ Java\jre6\bin\client\jvm.dll如何解决问题?
请帮我.
我正在使用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
我需要使用 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) 我可以从静态 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 等。这可能吗?
我很好奇我是否能做到这一点.可以从在浏览器中运行的Java小程序调用在本地主机上编译和加载的C++代码吗?
我有一个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)
但它无法编译,说:
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 …