标签: java-native-interface

在android NDK中包含本地头文件时的未定义引用

我构建了一个简单的android应用程序,它使用ndk和JNI.该应用程序具有onw .cpp(debugTest.cpp)文件,该文件用于将java和c ++与jni和另一个.c(javaEssentials.c)文件与其标头(javaEssentials.h)链接.当我在.cpp文件中包含.c文件(#include"javaEssentials.c")时,编译时不会报告错误.当我在.cpp文件中包含头文件时,编译器报告.c文件所具有的函数的未定义引用错误.这是一个真正奇怪的问题,我无法理解为什么会发生这种情况.像往常一样,我在.c文件中有一个包含头文件的声明.

我的android.mk是:

# build file written to describe the C and C++ source files to the Android NDK

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := debugTest
LOCAL_SRC_FILES := debugTest.cpp

include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

任何想法为什么会这样?

java-native-interface android header include android-ndk

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

如何在JNI和C++实现的DLL文件之间传递参数

以下代码在JAVA中声明

private native static Vector< Double > computeSimXML(Vector < String > vDocsPath);
Run Code Online (Sandbox Code Playgroud)

我想将参数vDocsPath(定义为Vector <String>)传递给C++,JNI生成的代码如下:(我已经实现了一些)

/*
 * Class:     SimXMLModule
 * Method:    computeSimXML
 * Signature: (Ljava/util/Vector;)Ljava/util/Vector;
 */
JNIEXPORT jobject JNICALL Java_SimXMLModule_computeSimXML
  (JNIEnv *, jclass, jobject)
{
   vector<double>  dist;

   dist.push_back(5.0);
   dist.push_back(6.0);

}
Run Code Online (Sandbox Code Playgroud)

如何获取vDocsPaththrough 的值jobject,并将dist(Vector< Double >在JAVA中定义)返回给JAVA?

c++ java dll java-native-interface native

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

JNI和静态接口

如果将方法定义为返回(静态)接口,那么JNI的"方法签名"是否不同?

在我的Java类中,我有这个方法:

public SharedPreferences.Editor getSharedPrefsEditor() {
    return mActivity.getPreferences(Context.MODE_PRIVATE).edit();
}
Run Code Online (Sandbox Code Playgroud)

SharedPreferences.Editor是SharedPreferences中的静态接口.

在我的C++ JNI代码中,我这样做:

// 'env' is the java environment that JNI passes to us
// 'jObject' is the one that JNI passes to us (along with env)
jclass javaCallerClass = env->GetObjectClass(jObject);
jmethodID methodId_getSharedPrefsEditor = env->GetMethodID(
    javaCallerClass,
    "getSharedPrefsEditor",
    "()Landroid/content/SharedPreferences/Editor;");
Run Code Online (Sandbox Code Playgroud)

由于一些奇怪的原因,这不起作用.它编译,但在运行时我得到这个:

DEBUG/dalvikvm(19020):GetMethodID:找不到方法:Lcom/mangotaster/madballs/MyRenderer; .getSharedPrefsEditor :()Landroid/content/SharedPreferences/Editor;

我正在以相同的方式调用该类中的其他方法而没有任何问题.

唯一的变化似乎是回报值.我确实尝试直接从JNI代码调用edit()函数,但得到了同样的错误 - 这让我相信我的函数签名"()Landroid/content/SharedPreferences/Editor;" 确实是错的.

有关SharedPreferences类的更多信息.

c++ java java-native-interface android

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

如何从jni端调用java方法?

我在jni方面做了一些c代码函数,所有工作都很好.

public native String getMessage() 
Run Code Online (Sandbox Code Playgroud)

函数返回从jni端到java端的字符串,它工作正常,所有其他jni代码也可以正常工作.但问题是如何在不使用return的情况下返回jni函数中的字符串,所以

public native void getMessagewithoutReturn()
Run Code Online (Sandbox Code Playgroud)

应该能够返回字符串.然后我,但getMessagewithoutReturn()函数永远不会使用pthread结束循环,如下所示,你可以看到:(它有效)

pthread_t native_thread;
pthread_create(&native_thread, NULL, native_thread_start_reading, env);
Run Code Online (Sandbox Code Playgroud)

并且每个循环迭代时间我都必须能够返回字符串,所以我不能使用return,因为它会停止函数运行.

pthread_t native_thread;
pthread_create(&native_thread, NULL, native_thread_start_reading, env);sted out that 
Run Code Online (Sandbox Code Playgroud)

我已经测试了那个posix线程,并且在android方面一切正常,因为它一直不是启动工作线程,但现在只是在每个迭代时间获取字符串的问题,而不使用函数返回.

java java-native-interface pthreads android-ndk

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

使用Android JNI库头的问题

我正在使用ndk 5并且样本构建正常.但是在我添加行的项目中 #include <SLES/OpenSLES.h> 它给出了编译错误,没有这样的文件或目录.除了源文件名之外,我的Android.mk与原生音频完全相同.

问题是什么?谢谢,Nahum

java-native-interface android

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

如何在Delphi 7中使用JNI

我需要将一个java应用程序加载到delphi项目.jre,j3d和jdk存在于delphi应用程序文件夹中名为java_files的文件夹中.Java类也存在于同一文件夹中.我需要将这个类加载到delphi应用程序中.我怎么能这样做

java delphi java-native-interface delphi-7

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

通过JNI将.c文件中的字符串数组传递给java dll

我试图让C#在我的java程序中实现一个类.我有一些更简单的例子,但是我遇到了我的java类将字符串数组作为构造函数的问题.

我的问题是如何在.c文件中创建一个字符串数组,然后可以将其传递给java类?

在那一刻,我设法传递了一个jString对象.

这是我的.c文件中的方法.

jobject newClassInstance()
{

    jmethodID MID_init;
    jobject obj;
    jstring name;
    jobjectArray ret;

    MID_init = (*env)->GetMethodID (env, jClass, "<init>", "([Ljava/lang/String;)V");
    if (!MID_init) {
        printf("Error: dllClass.<init>() not found\n");
        return NULL;
    }

    name = (*env)->NewStringUTF(env,"Moo");




    obj = (*env)->NewObject(env, jClass, MID_init, name);
    if (!obj) {
        printf("Error: failed to allocate an object\n");
        return NULL;
    }
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

如果您需要更多信息,请告诉我.

亲切的问候

c c# java java-native-interface interop

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

更改包名称会破坏JNI

我尝试使用pocketsphinx包为我的应用程序,并需要将演示程序包名称重命名为有用的东西(例如com.myname.foo)

我花了好几个小时搞清楚,但我根本无法让它发挥作用.

问题是,如果我保留包名称并且没有任何问题(除了随机崩溃),项目运行正常,但是当我重命名它时,我得到错误

FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: new_Config__SWIG_0
Run Code Online (Sandbox Code Playgroud)

我已经尝试过修改Swig命令,但它也没有用.

有任何想法吗?

我只更改了Manifest的包名声明和普通Activity的包文件夹.

java-native-interface android cmusphinx

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

Android NDK是了解wchar支持的方式吗?

我在android上需要关于wchar的建议.Android Marketplace是否支持crystax编译?WCHAR支持现在也包括像wcscmp这样的比较运算符吗?我到处都有wchar*,const wchar*foo(const wchar*)和wchar_t*[].

c++ java-native-interface android android-ndk

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

只使用C可以使用Windows API吗?

我正在自学C(来自Java).我非常欣赏这门语言,而且我学习它的主要原因之一是我可以利用Java内置的JNI功能在必要时编写本机代码.我的问题主要是关于Windows API.我可以仅使用C来使用API​​的功能和特性吗?

Windows API是否与纯C代码兼容,或者它是否包含只能由C++代码使用的类?

另外,如果我在Windows机器上编译共享库(lib.sl NOT lib.dll),它是否可以在另一台机器(Mac/Linux)上运行?

c windows java-native-interface winapi shared-libraries

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