IDE:安卓工作室
我有位于“jniLibs”文件夹下的静态库。
我也加载了那个库。这是我使用的代码:
static
{
System.loadLibrary("elianjni");
}
Run Code Online (Sandbox Code Playgroud)
本机方法在单独的类(ElianNative)上声明为:
public native int InitSmartConnection(String paramString, int paramInt1, int paramInt2);
public native int StartSmartConnection(String paramString1, String paramString2, String paramString3, byte paramByte);
Run Code Online (Sandbox Code Playgroud)
但是,当我调用该方法时InitSmartConnection,应用程序崩溃了,错误是:
java.lang.UnsatisfiedLinkError: Native method not found: com.monitor.camera.connect.ElianNative.InitSmartConnection:(Ljava/lang/String;II)I
at com.monitor.camera.connect.ElianNative.InitSmartConnection(Native Method)
Run Code Online (Sandbox Code Playgroud)
我不知道这可能的原因,因为我只是从另一个WORKING项目中复制了这个库,然后在声明方法和导入必要的头文件时做了同样的事情。
造成此类问题的可能原因是什么?我在堆栈上搜索,有人说这是.c文件中方法之前缺少Java关键字。但是,我不认为这可能是问题所在,因为就像我所说的,这是在另一个运行良好的项目中使用的。
我有一个要求,我需要使用 JNI 将一些值从 C++ 传递到 JAVA。根据要求,c++ 代码的输入是一条带有点列表的线,我必须读取每个点的 x 和 y 坐标并返回到 java 代码。我已将列表声明为 std::list> listofpoints; 并读取 x 和 y 坐标为
for(size_t j = 0; j < track->geometry.points.size(); ++j)
{
PointZ &p = track->geometry.points[j] listofpoints.push_back(std::pair<double, double>(p.vertex.position.x,p.vertex.position.y));
Run Code Online (Sandbox Code Playgroud)
这个 geometry.points 是读取每个点,获取 x 和 y 坐标。现在我将此 listofpoints 返回给 JNI 方法。在这里我必须编写代码,以便它读取 x 和 y 坐标并将其发送到 JAVA 方法。我正在寻找一种迭代列表并获取值的方法,但是,我发现很难从 JNI 返回到 JAVA,因为 JNI 仅返回 jobjectarray。如何将此列表转换为 JNI 中的数组并发送到 JAVA 方法。我对 JNI 和 JAVA 也很陌生。
JNI CallObjectMethod中有3种方法 CallObjectMethodV CallObjectMethodA 那么这些方法有什么区别呢?
jobject (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);
jobject (*CallObjectMethodV)(JNIEnv*, jobject, jmethodID, va_list);
jobject (*CallObjectMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
Run Code Online (Sandbox Code Playgroud) 我正在为 Android 制作一个 C++ 共享库。我使用 Android Studio 创建了新项目并启用了 C++。
我还启用了 C++ 11 ans 异常支持。
新项目已创建,build.gradle并且CMakeLists.text文件。问题是 Adnroid Studio 只生成 *.so 库的调试版本。我也需要生成发布版本。
调试库正在生成
\app\build\intermediates\cmake\debug\obj\\libnative-lib.so
我注意到还有另一个目录在
\app\build\intermediates\cmake\debug\obj\
但它是空的。它没有库的发布版本。
如何强制 Android Studio 构建/编译 *.so 库的发布版本。我把这些图片放在一起,以确保我不会错过任何一步。
使用Android Studio 2.3。
c++ java-native-interface c++11 android-studio android-gradle-plugin
我正在我的一个移动应用程序中将代码从 Java 转换为 Kotlin,而在 Java 中运行的代码在 Kotlin 中停止运行。它使用 JNI 桥来调用 C++ 代码。
Kotlin 方法声明:
class Converter{
companion object {
external fun convertNative(width: Int, height: Int, row: Int, input: ByteArray, ft: Int, output: ByteArray)
}
}
Run Code Online (Sandbox Code Playgroud)
.cc 代码:
extern "C" {
JNIEXPORT void JNICALL OBJECT_TRACKER_METHOD(convertNative)(JNIEnv* env, jobject thiz, jint width, jint height, jint row,
jbyteArray input, jint ft, jbyteArray output);
}
JNIEXPORT void JNICALL OBJECT_TRACKER_METHOD(convertNative)(
JNIEnv* env, jobject thiz, jint width, jint height, jint row,
jbyteArray input, jint ft, jbyteArray output) …Run Code Online (Sandbox Code Playgroud) 我在 android studio 中的 JNI 中使用此代码。一些用例在运行时导致崩溃和其他工作。也许它与内存泄漏有关。我收到此错误:
SIGSEGV(信号 SIGSEGV:无效地址(故障地址:0xffffffffdeadbaad))
jstring jstr1 = (*env)->NewStringUTF(env, ""); char *m1 = (char *)(*env)->GetStringUTFChars(env,jstr1, 0);
jstring jstr2 = (*env)->NewStringUTF(env, "-");
char *m2 = (char *)(*env)->GetStringUTFChars(env,jstr2, 0);
jstring jstr3 = (*env)->NewStringUTF(env, "");
char *aaa = (char *)(*env)->GetStringUTFChars(env,jstr3, 0);
// ...
strcat(aaa,m1);
(*env)->ReleaseStringUTFChars(env, jstr1, m1);//no problem
strcat(bbb,m2);
(*env)->ReleaseStringUTFChars(env, jstr2, m2);//no problem
strcat(str,aaa);
//(*env)->ReleaseStringUTFChars(env, jstr3, aaa);//crash
strcat(str,bbb);
(*env)->ReleaseStringUTFChars(env, jstr4, bbb);//no problem
strcat(str,m3);
(*env)->ReleaseStringUTFChars(env, jstr5, m3);//no problem
strcat(str,ccc);
jstring res = (*env)->NewStringUTF(env, str);
//(*env)->ReleaseStringUTFChars(env, jstr6, str);//crash
Run Code Online (Sandbox Code Playgroud) 我的 Java 类中有一个返回 string 的方法。当前方法签名 ()Ljava/lang/String; 我可以在本地调用中使用 JVM 创建类和方法 ID。已经完成了 GetStaticMethodID 等......一切都很好。
如何调用这个方法?例如: env->CallIntMethod() env->CallCharMethod() .... 哪个选项可以取回字符串?
在 C++ 中,我需要复制此 Java 方法返回的字符串值。注意:如果需要,我可以更改 Jar 中方法的签名。或者可以添加另一种方法来包装另一个。
我正在尝试通过 JNI 将数据库值传递给 Java:
__android_log_print(ANDROID_LOG_ERROR, "MyApp", "c_string >>> %s", cStringValue);
打印: c_string >>>
env->SetObjectField(jPosRec, myJniPosRec->_myJavaStringValue, env->NewStringUTF(strdup(cStringValue)));
Run Code Online (Sandbox Code Playgroud)
但是,这将失败而没有错误。
您如何在 JNI中将特殊字符(例如表情符号)传递给 Java?
谢谢大家。
我正在运行一个传感器和位置服务,数据被传递到 TraceManager 文件,在那里它被处理并传递给 TraceCWrapper 以映射到一个共享的 C 库。所以,似乎传感器和位置数据很好并被接收在 TraceManager 中,它然后被传递到 TraceCWrapper,但是应用程序在几秒钟后崩溃,我得到的唯一错误行是:
A/libc:致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),tid 29938 中的故障地址 0x8 (AsyncTask #1),pid 29870 (pp.traceandroid)
public class TraceManager extends AppCompatActivity {
private String TAG = "TraceManager";
private int phoneAngle = 0;
private double initialStepCalibrationOffset;
private int initialPointingAngleDeg = 0;
private int initialAlignmentMode = 0;
private int startingFloorID = 0;
private LatLng startingLatLong;
private double startingAccuracy = 1.0;
private Context context;
private boolean isMagConsistentAtInit = false;
private boolean isMagValid = true;
private Timer callBackTimer; …Run Code Online (Sandbox Code Playgroud) java java-native-interface android jna android-native-library
build.gradle模块targets一行: externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
targets "native-lib" // New line
}
}
Run Code Online (Sandbox Code Playgroud)
不知何故,当我单击绿色播放按钮(运行“应用程序”)时出现错误:
Build file '<project folder>/app/build.gradle' line: 5
A problem occurred evaluating project ':app'.
> No signature of method: build_bcdq4hni531na6stswx8a7txx.android() is
applicable for argument types: (build_bcdq4hni531na6stswx8a7txx$_run_closure1)
values: [build_bcdq4hni531na6stswx8a7txx$_run_closure1@41fd5f78]
Run Code Online (Sandbox Code Playgroud)
到底是怎么回事?
该targets属性记录在:https : //developer.android.com/studio/projects/gradle-external-native-builds
这个问题的答案也使用targets属性。
在构建 Android 应用程序时禁用 CMake 目标
我什至不能通过添加arguments "-DOPTION=1"到CMake 来传递参数build.gradle!