我构建了一个简单的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中声明
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?
如果将方法定义为返回(静态)接口,那么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类的更多信息.
我在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方面一切正常,因为它一直不是启动工作线程,但现在只是在每个迭代时间获取字符串的问题,而不使用函数返回.
我正在使用ndk 5并且样本构建正常.但是在我添加行的项目中
#include <SLES/OpenSLES.h>
它给出了编译错误,没有这样的文件或目录.除了源文件名之外,我的Android.mk与原生音频完全相同.
问题是什么?谢谢,Nahum
我需要将一个java应用程序加载到delphi项目.jre,j3d和jdk存在于delphi应用程序文件夹中名为java_files的文件夹中.Java类也存在于同一文件夹中.我需要将这个类加载到delphi应用程序中.我怎么能这样做
我试图让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)
如果您需要更多信息,请告诉我.
亲切的问候
灰
我尝试使用pocketsphinx包为我的应用程序,并需要将演示程序包名称重命名为有用的东西(例如com.myname.foo)
我花了好几个小时搞清楚,但我根本无法让它发挥作用.
问题是,如果我保留包名称并且没有任何问题(除了随机崩溃),项目运行正常,但是当我重命名它时,我得到错误
FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: new_Config__SWIG_0
Run Code Online (Sandbox Code Playgroud)
我已经尝试过修改Swig命令,但它也没有用.
有任何想法吗?
我只更改了Manifest的包名声明和普通Activity的包文件夹.
我在android上需要关于wchar的建议.Android Marketplace是否支持crystax编译?WCHAR支持现在也包括像wcscmp这样的比较运算符吗?我到处都有wchar*,const wchar*foo(const wchar*)和wchar_t*[].
我正在自学C(来自Java).我非常欣赏这门语言,而且我学习它的主要原因之一是我可以利用Java内置的JNI功能在必要时编写本机代码.我的问题主要是关于Windows API.我可以仅使用C来使用API的功能和特性吗?
Windows API是否与纯C代码兼容,或者它是否包含只能由C++代码使用的类?
另外,如果我在Windows机器上编译共享库(lib.sl NOT lib.dll),它是否可以在另一台机器(Mac/Linux)上运行?