我正在使用PDE运行Processing sketch,我收到以下错误:
验证
java.library.path属性是否已正确设置.
你们有人能告诉我如何解决这个问题吗?
我想将一个字符串传递给我正在写的JNI,它必须分配给一个const char*.下面提到我是如何做到的:
JNI...(...,jstring jstr...){
const char* str = env->GetStringUTFChars(jstr,0);
env->ReleaseStringUTFChars(str,jstr,0);
}
Run Code Online (Sandbox Code Playgroud)
但是如果我在分配给jstring后打印const char*str,那么与我直接在JNI和printf中分配str值相比,我看到的是不同的.
这是正确的方法吗?或者是否还有其他方法可以将字符串从java分配给JNI中的const char*?
是否有可能在Android手机上使用SQLite和C++?我没有找到任何关于如何实现这一目标的文件.
我尝试在Android NDK上工作,我的第一次测试不是很确定,我需要帮助,因为我没有看到我的错误在哪里.
以下代码编译没有问题,但是当在模拟器上运行时,程序返回SIGSEGV信号,并且没有在logcat中显式写入错误.但是,会出现一条警告,指示未找到Java类.经过一天的研究,这一切看起来都是正确的.
这是我的Java代码:JNITestActivity.java
package com.test.jnitest;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class JNITestActivity extends Activity {
private static String LIB_NAME = "JNItest";
static {
System.loadLibrary(LIB_NAME);
}
public static native void javaCallJNI();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i("onCreate", "Native function begining");
javaCallJNI();
Log.i("onCreate", "Native function ending");
}
void callFromCPP() {
Log.i("callFromCPP", "JNI can call JAVA !");
return ;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的C++代码:testjni.cpp
#include <jni.h>
#include <android/log.h>
#define LOG_TAG "testjni"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
extern "C" {
JNIEXPORT void …Run Code Online (Sandbox Code Playgroud) 我试图用Java(从C)执行具有以下签名的函数:
public void execute(int x, int y, int action);
Run Code Online (Sandbox Code Playgroud)
我的问题是在GetMethodID中定义函数签名:
env->GetMethodID(hostClass, "execute", "(I;I;I;)V");
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是:
W/dalvikvm( 1849): Bogus method descriptor: (I;I;I;)V
W/dalvikvm( 1849): Bogus method descriptor: (I;I;I;)V
D/dalvikvm( 1849): GetMethodID: method not found: Lcom/device/client/HostConnection;.execute:(I;I;I;)V
Run Code Online (Sandbox Code Playgroud)
我不知道如何在GetMethodID中指定方法签名(对于3个整数作为参数).我看到人们使用";" 为String和File类分隔其他帖子中的参数,但没有像整数这样的原语.
请问这样做的正确方法是什么?
谢谢.
一段C/C++代码可以为JNI方法提供一个函数指针数组.但是有没有办法直接从Java代码内部(不使用JNI或类似代码)调用数组指针指向的函数?JNI以某种方式做了类似的事情,所以必须有办法.JNI是如何做到的?是通过sun.misc.Unsafe吗?即使不是,我们是否可以使用一些不安全的解决方法来获取执行此操作的JVM代码?
我当然不打算在商业上使用它.我甚至不是专业人士,我只是非常喜欢编码而且我最近一直在研究CUDA所以我想也许我可以尝试将所有东西混合在一起,但JNI调用的开销会破坏GPU加速代码的目的.
虽然我可以使用用于Java代码的Eclipse JDT调试器和用于C代码的GDB调试我的应用程序,但我更倾向于使用单个工具进行所有调试.我找到了几个在Eclipse中启用"混合模式"调试的项目,并支持Java和本机代码之间的单步执行.
不幸的是,一个声称是预发布质量,另一个目前没有维护. 是否有任何插件以可靠的方式为Eclipse带来混合模式调试功能,还是应该继续使用两个单独的调试器?
我有一个NDK库和相应的Java类的工作实现.但我无法将重载方法添加到该类.目前我的班级包含:
package com.package;
public class MyClass
{
public static native String getFileName();
static
{
System.loadLibrary("mylib");
}
}
Run Code Online (Sandbox Code Playgroud)
我的jniwrappers.cpp文件有以下声明:
JNIEXPORT jstring JNICALL
Java_com_package_MyClass_getFileName(_JNIEnv* env, jobject thiz);
Run Code Online (Sandbox Code Playgroud)
到目前为止一切正常.但接下来我修改了我的课程:
package com.package;
public class MyClass
{
public static native String getFileName();
public static native String getFileName(int index);
...
}
Run Code Online (Sandbox Code Playgroud)
并添加到jniwrappers.cpp另一个声明:
JNIEXPORT jstring JNICALL
Java_com_package_MyClass_getFileName__I(_JNIEnv* env, jobject thiz, jint index);
Run Code Online (Sandbox Code Playgroud)
它编译得很好,Android应用程序启动,没有得到UnsatisfiedLinkError,但是当它调用带参数的第二个方法时,第一个C++函数被调用但不是第二个.我在该类中有其他方法参数,但它们都没有重载,所以它们各自的JNI签名不包含参数.
那么,我做错了什么?
我得到了一个用C++编写的应用程序,我可以通过在C++中编写插件来扩展应用程序功能.
我基本上想要做的是将Java嵌入到这个应用程序中.这已经用Python完成了(不是由我完成的).
我读了一些关于JNI的内容,但总是有一个使用Java类的完整程序的演讲.
我想要做的是,使用Java中的C++类来与应用程序进行交互.
在这种情况下,它是一个3D应用程序,称为Cinema 4D.
有没有办法在应用程序运行时(使用某种脚本语言)使用JNI或类似的东西编译和评估Java代码?
嵌入完成后的虚构代码示例:
import c4d.documents.*;
class Main {
public static void main() {
BaseDocument doc = GetActiveDocument();
BaseObject op = doc.GetActiveObject();
if (op != null) {
op.Remove();
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码应与Cinema 4D交互以删除所选对象.
所以今天在这里的人们的帮助下,我整理了一个使用ndk的简单Android应用程序.我将特征库直接导入到我在源代码树中创建的jni文件夹中,然后使用cygwin我能够编译项目.继承源,以便其他人尝试学习jni基础知识,从c ++到java传递数据,然后返回一些代码.该应用程序在edittext字段中只占用6个数字,当用户单击该按钮时,两个浮点数组将传递给本机方法并加载到两个特征浮点向量中,然后将它们相加.两个向量的乘积传递回java,然后显示在textview中.
下面是android的特征库的链接:
https://bitbucket.org/erublee/eigen-android
Run Code Online (Sandbox Code Playgroud)
您只需要在文件树中向下一层的实际特征文件夹.只需将一层的特征文件夹复制并粘贴到特征源中,然后放入您创建的jni文件夹中,以便在您的android项目中保存您的c ++代码.
继承人java:
package jnimath.act;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class JnimathActivity extends Activity {
/** Called when the activity is first created. */
public EditText x;
public EditText y;
public EditText z;
public EditText x2;
public EditText y2;
public EditText z2;
public float[] vecArray;
public TextView textView1;
public Button run;
float[] array3 = new float[3];
float[] array1 = new float[3];
float[] array2 = new float[3]; …Run Code Online (Sandbox Code Playgroud) java ×6
android-ndk ×5
android ×4
c++ ×3
c ×1
debugging ×1
eclipse ×1
embed ×1
jvm ×1
native-code ×1